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