int main() { int tst,t,i,j,f,k,c,ansi,cnt,cs; //scanf("%d",&tst); FastInput input; tst = input.readNextUnsigned(); for(cs=1; cs<=tst; cs++) { n = input.readNextUnsigned(); e = input.readNextUnsigned(); ac = input.readNextUnsigned(); ini(); int myMaxWeight = 0; for(j=0; j<e; j++) { f = input.readNextUnsigned(); t = input.readNextUnsigned(); c = input.readNextUnsigned(); if (c < ac) { //linear sort edgesCounting[c].push_back(make_pair(f,t)); myMaxWeight = max(myMaxWeight,c); } } //linear sort extraction int weightTotal = 0; for(int weight = 1; weight<=myMaxWeight;++weight) { for(int j=0;j<edgesCounting[weight].size();++j) { int xroot = set_find(edgesCounting[weight][j].first); int yroot = set_find(edgesCounting[weight][j].second); if (xroot != yroot) { link(xroot,yroot); weightTotal += weight; } } edgesCounting[weight].clear(); } ansi=weightTotal; cnt=0; for(i=1; i<=n; i++) if(par[i]==i)cnt++; printf("Case #%d: %d %d\n",cs,ansi+(cnt*ac),cnt); } return 0; }
int main() { FastInput input; int nCases = input.readNextUnsigned(); for(int caseNum = 1; caseNum<=nCases;caseNum++) { n = input.readNextUnsigned(); k = input.readNextUnsigned(); maxFactor = min (n,k); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { grid[i][j] = input.readNextUnsigned(); memo[i][j] = -1; } } printf("%d\n",unrolledHop(0,0,grid[0][0])+grid[0][0]); if (caseNum == nCases) break; printf("\n"); } return 0; }
int main() { int nCities, nRoads; ios_base::sync_with_stdio(false); FastInput input; while (true) { nCities = input.readNextUnsigned(); nRoads = input.readNextUnsigned(); if (nCities == 0 && nRoads == 0) break; vector<Edge> edges; for(int i=0;i<nRoads;i++) { int u = input.readNextUnsigned(); int v = input.readNextUnsigned(); int w = input.readNextUnsigned(); edges.push_back(Edge(u,v,w)); //assert(w < 100000); } ini(nCities); sort(begin(edges), end(edges)); int maxW = 0; int nConnected = 0; for(int i=0;i<edges.size();i++) { int xroot = set_find(edges[i].u); int yroot = set_find(edges[i].v); if (xroot != yroot) { link(xroot,yroot); int w = edges[i].w; nConnected++; if (w > maxW) maxW = w; } } if (nConnected + 1 == nCities) cout << maxW << "\n"; else cout << "IMPOSSIBLE\n"; } return 0; }
int main() { FastInput input; int nComputers; nComputers = input.readNextUnsigned(); while (true) { if (nComputers == 0x80000000) break; long long sum = 0; for(int i=0;i<nComputers-1;++i) { int u, v, w; u = input.readNextUnsigned(); v = input.readNextUnsigned(); w = input.readNextUnsigned(); sum +=w; } cout << sum << '\n'; int nAdditionalComputers = input.readNextUnsigned(); nEdges = 0; for(int i=0;i<nAdditionalComputers;i++) { int u, v, w; u = input.readNextUnsigned(); v = input.readNextUnsigned(); w = input.readNextUnsigned(); edges[nEdges++] = Edge(u,v,w); } int nAdditionalEdges = input.readNextUnsigned(); for(int i=0;i<nAdditionalEdges;++i) { int u, v, w; u = input.readNextUnsigned(); v = input.readNextUnsigned(); w = input.readNextUnsigned(); edges[nEdges++] = Edge(u,v,w); } sort(edges, edges+nEdges); UnionFind uf(nComputers+1); long long newSum = 0; for(int i=0;i<nEdges;++i) { //take off edge int w = edges[i].w; int u = edges[i].u; int v = edges[i].v; int xroot = uf.find(u); int yroot = uf.find(v); if (xroot != yroot) { uf.Union(xroot,yroot); newSum += w; } } cout << newSum << '\n'; nComputers = input.readNextUnsigned(); if (nComputers == 0x80000000) break; cout << '\n'; } return 0; }
int main() { //ios_base::sync_with_stdio(false); FastInput input; int nCases = input.readNextUnsigned(); for(int caseNum=1;caseNum<=nCases;++caseNum) { int N = input.readNextUnsigned(); int M = input.readNextUnsigned(); int A = input.readNextUnsigned(); int nEdges = 0; int myMaxWeight = 0; int myMinWeight = 1000000; for(int i=0;i<M;++i) { int u = input.readNextUnsigned(); int v = input.readNextUnsigned(); int w = input.readNextUnsigned(); --u;--v; if (w >= A) continue; edges.insert(make_pair(w,make_pair(u,v))); //edgesCounting[w].push_back(make_pair(u,v)); //myMaxWeight = max(myMaxWeight, w); //myMinWeight = min(myMinWeight, w); //adj[v].push_back({u,w}); } UnionFind uf(N); //sort in linear time /* weightTotal = 0; for(int weight = myMinWeight; weight<=myMaxWeight;++weight) { for(int j=0;j<edgesCounting[weight].size();++j) { int xroot = uf.find(edgesCounting[weight][j].first); int yroot = uf.find(edgesCounting[weight][j].second); if (xroot != yroot) { uf.Union(xroot,yroot); weightTotal += weight; } } edgesCounting[weight].clear(); } */ weightTotal = 0; //sort(edges,edges + nEdges); //stable sort while (edges.size()) { auto temp = edges.begin(); int w = temp->first; int xroot = uf.find(temp->second.first); int yroot = uf.find(temp->second.second); edges.erase(temp); if (xroot != yroot) { uf.Union(xroot,yroot); weightTotal += w; } } /* for(int i=0;i<nEdges;++i) { int xroot = uf.find(edges[i].second.first); int yroot = uf.find(edges[i].second.second); if (xroot != yroot) { uf.Union(xroot,yroot); weightTotal += edges[i].first; } } */ nComponents = 0; for(int i=1;i<=N;++i) { int place = uf.find(i); if (!mySet[place]) { ++nComponents; mySet[place] = 1; } } mySet = 0; int ans = weightTotal + A * nComponents; cout << "Case #" << caseNum << ": " << ans << " " << nComponents << '\n'; } return 0; }