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;
}
Exemple #3
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;
}
Exemple #5
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;
}