Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2331 Accepted Submission(s): 804
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t;
int n,m,q;
struct path
{
int s;
int e;
int dis;
bool operator <(const path &x)const{
return dis<x.dis;
}
}P[100005];
struct limi
{
int id;
int limit;
bool operator <(const limi &x)const{
return limit<x.limit;
}
}L[100005];
__int64 re[5005];
int parent[20005];
int mp[20005];
int Find(int mubiao)
{
if(parent[mubiao]!=mubiao)
parent[mubiao]=Find(parent[mubiao]);
return parent[mubiao];
}
void init()
{
for(int j=1;j<=n;j++)
{
parent[j]=j;
mp[j]=1;
}
memset(re,0,sizeof(re));
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&q);
for(int i=0;i<m;i++)
scanf("%d%d%d",&P[i].s,&P[i].e,&P[i].dis);
sort(P,P+m);
for(int i=0;i<q;i++)
{
L[i].id=i;
scanf("%d",&L[i].limit);
}
sort(L,L+q);
init();
int gg=0;
__int64 he=0;
for(int i=0;i<q;i++)
{
while(gg<m&&L[i].limit>=P[gg].dis)
{
int ss=Find(P[gg].s);
int ee=Find(P[gg].e);
if(ss!=ee)
{
he+=mp[ss]*mp[ee];
parent[ee]=ss;
mp[ss]+=mp[ee];
}
gg++;
}
re[L[i].id]=he;
}
for(int i=0;i<q;i++)
printf("%I64d\n",2*re[i]);
}
return 0;
}
原文:http://www.cnblogs.com/hsd-/p/4924673.html