您的位置:首页 > 其它

HDU-4313-Matrix

2014-07-10 18:01 288 查看
这个题意比较简单,做法就是最小生成树的反向求解(排序从大到小),只要当前并查集查出2个都为要求点,那么这条边的权值就应该加上。否则合并

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int inf=1<<29;
const int maxn=1e5+1000;
struct Node
{
int u;
int v;
int c;
bool operator < (const Node &a)const
{
return c>a.c;
}
}a[maxn];
int n,m,p[maxn];
bool is[maxn];
int find(int x)
{
if(p[x]==-1)
return x;
return p[x]=find(p[x]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(is,0,sizeof(is));
memset(p,-1,sizeof(p));
scanf("%d%d",&n,&m);
for(int i=0;i<n-1;i++)
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].c);
sort(a,a+n-1);
for(int i=0;i<m;i++)
{
int u;
scanf("%d",&u);
is[u]=1;
}
long long ans=0;
for(int i=0;i<n-1;i++)
{
int x=find(a[i].u);
int y=find(a[i].v);
if(is[x]&&is[y])
{
ans+=a[i].c;
}
else if(is[x])
{
p[y]=x;
}
else
{
p[x]=y;
}
}
printf("%I64d\n",ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最小生成树