Cod sursa(job #5563)

Utilizator vlad_DVlad Dumitriu vlad_D Data 13 ianuarie 2007 10:47:28
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;

int n, m, p;
int i, j;
struct nod{
	int a, b, cost;
	nod(int _a, int _b, int _cost) {a=_a; b=_b; cost = _cost;};
	nod(){};

};
vector<vector<nod> > v;
priority_queue<nod > Q;
bool operator<(const nod &aa, const nod &bb) {
	if (aa.cost > bb.cost) return true;
	return false;
	}
int usa[10007];
int nr;
vector<nod > sol;
int main() {
	freopen("flood.in", "r", stdin);
	freopen("flood.out", "w", stdout);
	scanf("%d", &n);
	v.resize(n+3);
	scanf("%d", &m);
	for (i=1; i<=m; i++) {
		int a, b;
		scanf("%d %d", &a, &b);
		v[a].push_back(nod(a, b, 0));
		v[b].push_back(nod(b, a, 0));
		}
	scanf("%d", &p);
	for (i=1; i<=p; i++) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		v[a].push_back(nod(a, b, c));
		v[b].push_back(nod(b, a, c));
		}
	usa[1] = 1;
	for (i=0; i<v[1].size(); i++) Q.push(v[1][i]); 
	int total = 0;
	while(1) {
	if (Q.empty()) break;
	nod X = Q.top();
	Q.pop();
	//printf("%d %d %d\n", X.a, X.b, X.cost);
	if (!usa[X.b]) {
		if (X.cost) {nr++; sol.push_back(X);}
		usa[X.b]=1;
		total+=X.cost;
		for (i=0; i<v[X.b].size(); i++) Q.push(v[X.b][i]);
	}
	
	}
	printf("%d\n%d\n" ,nr, total);
	for (i=0; i<sol.size(); i++) printf("%d %d %d\n", sol[i].a, sol[i].b, sol[i].cost);
	return 0;
}