题意:给你n个点,m条边,k个可以发电的地方,问你最小路径
一开始根本没想到用并查集去做简直是傻*了,
先将所有发电站放入并查集中,然后用kruscal寻找路径,找出来的就是最小路径了。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<stack>
#include<map>
#define maxn 205
using namespace std;
struct node
{
int u,v,dis;
}edge[maxn*maxn];
int father[maxn];
int find(int x)
{
if(father[x]==x) return x;
else return father[x]=find(father[x]);
}
bool cmp(node a,node b)
{
return a.dis<b.dis;
}
int main()
{
int t;
int cnt=0;
scanf("%d",&t);
while(t--)
{
int i,j;
int n,m,k;
int fa;
int u,v;
int jie;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++) father[i]=i;
scanf("%d",&fa);
for(i=2;i<=k;i++)
{
scanf("%d",&jie);
father[jie]=fa;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].dis);
}
sort(edge+1,edge+m+1,cmp);
int ans=0;
for(i=1;i<=m;i++)
{
u=edge[i].u;
v=edge[i].v;
if(find(u)==find(v)) continue;
ans+=edge[i].dis;
father[father[u]]=father[v];
}
printf("Case #%d: %d\n",++cnt,ans);
}
return 0;
}