10 10 10 7 2 1 6 8 3 4 5 8 5 8 2 2 8 9 6 4 5 2 1 5 8 10 5 7 3 7 7 8 8 10 6 1 5 9 1 8 2 7 6
36 13 1 13 36 1 36 2 16 13
#include<stdio.h> #include<algorithm> using namespace std; const int N = 10005; struct EDG { int u,v,c; }; struct ANS { int i,c; }; EDG edg[N*5]; ANS ans[N]; int fath[N],node[N],n; int cmp1(const EDG &a,const EDG &b) { return a.c<b.c; } int cmp2(const ANS &a,const ANS &b) { return a.c<b.c; } void init() { for(int i=1; i<=n;i++) { node[i]=1; fath[i]=i; } } int findfath(int x) { if(x!=fath[x]) fath[x]=findfath(fath[x]); return fath[x]; } int main() { int m,q,aa[N]; while(scanf("%d%d%d",&n,&m,&q)>0) { init(); for(int i=1;i<=m;i++) scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].c); for(int i=1;i<=q;i++) { scanf("%d",&ans[i].c); ans[i].i=i; } sort(edg+1,edg+1+m,cmp1); sort(ans+1,ans+1+q,cmp2); int sum,u,v,tq,tm; sum=0; tq=tm=1; while(tm<=m) { if(edg[tm].c<=ans[tq].c) { u=findfath(edg[tm].u); v=findfath(edg[tm].v); if(u!=v) { sum+=node[u]*node[v]; fath[u]=v; node[v]+=node[u]; } tm++; } else while(tq<=q&&edg[tm].c>ans[tq].c) { aa[ans[tq].i]=sum; tq++; } if(tq>q) break; } while(tq<=q) { aa[ans[tq].i]=sum; tq++; } for(int i=1;i<=q;i++) printf("%d\n",aa[i]); } }
原文:http://blog.csdn.net/u010372095/article/details/44537423