Pagini recente » Cod sursa (job #2119468) | Cod sursa (job #180164) | Cod sursa (job #1245196) | Cod sursa (job #764421) | Cod sursa (job #5566)
Cod sursa(job #5566)
#include <cstdio>
#include <vector>
#define pb push_back
#define sz size()
#include <algorithm>
#define maxn 10005
#define maxm 200005
using namespace std;
struct nod { int x, w,y; nod(int _x,int _y, int _w){ x=_x;y=_y; w=_w;}; nod(){};};
vector<vector<int> >a;
nod E[maxm];
bool viz[maxn];
int componenta[maxn], H;
int t[maxn], st[maxn], T;
int n, m, p, k;
int P;
int rang[maxn];
bool vz[maxm];
bool operator<(const nod &a, const nod &b)
{
if(a.w<b.w) return 1;
return 0;
}
void citire()
{
int i,xx, yy, w;
freopen("flood.in", "r", stdin);
scanf("%d\n", &n);
a.resize(n+1);
scanf("%d\n", &m);
for(i=1;i<=m;i++)
{
scanf("%d %d\n", &xx, &yy);
a[xx].pb(yy);
a[yy].pb(xx);
}
scanf("%d\n", &p);
for(i=1;i<=p;i++)
{
scanf("%d %d %d\n", &xx, &yy, &w);
nod aux;
aux.x=xx;
aux.y=yy;
aux.w=w;
E[i]=aux;
}
}
void dfs1(int nd)
{
viz[nd]=1; componenta[nd]=k;
t[nd]=T;
for(int i=0;i<a[nd].sz;i++)
if(!viz[a[nd][i]])
dfs1(a[nd][i]);
}
int multime(int i)
{
if(t[i]!=i) t[i]=multime(t[i]);
return t[i];
}
int uneste(int i, int j)
{
i=multime(i);
j=multime(j);
if(i==j) return 0;
if(rang[i]<rang[j]) t[i]=j;
else t[j]=i;
if(rang[i]==rang[j]) rang[i]++;
return 1;
}
void calcul()
{
int i;
for(i=1;i<=n;i++) t[i]=i;
for(i=1;i<=n;i++) if(!viz[i]) { k++; T=i; dfs1(i);}
sort(E+1, E+p+1);
int sum=0;
int nrsol=0;
for(i=1;i<=p;i++)
if(uneste(E[i].x, E[i].y))
{
sum+=E[i].w;
nrsol++;
vz[i]=1;
}
freopen("flood.out", "w", stdout);
printf("%d\n", nrsol);
printf("%d\n", sum);
for(i=1;i<=p;i++) if(vz[i]) printf("%d %d %d\n", E[i].x, E[i].y, E[i].w);
// for(i=1;i<=n;i++) printf("%d ", t[i]);
//printf("\n");
}
int main()
{
citire();
calcul();
return 0;
}