/*
思路:水题,直接先将连接起来的边处理掉,将他们连接到一个集合 用并查集,其余的就是克鲁斯卡尔了
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
using namespace std;
struct edge
{
int from,to,w;
};
int n,m;
vector<edge>edges;
int map[101][101];
int top;
int pre[101];
void addedge(int x,int y,int w)
{
edge v={x,y,w};
edges.push_back(v);
}
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int find(int x)
{
if(x==pre[x])
{
return x;
}
else
{
pre[x]=find(pre[x]);
return pre[x];
}
}
void kluska()
{ int sum=0;
for(int i=0;i<edges.size();i++)
{
edge v=edges[i];
int f1=find(v.from);
int f2=find(v.to);
if(f1!=f2)
{
pre[f2]=f1;
top--;
sum+=v.w;
}
if(top==1) break;
}
printf("%d\n",sum);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{ edges.clear();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(map[i][j]!=0)
{
addedge(i,j,map[i][j]);
//printf("aa");
}
}
}
int q;
scanf("%d",&q);
sort(edges.begin(),edges.end(),cmp);
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
top=n;
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int f1=find(x);
int f2=find(y);
if(f1!=f2)
{
pre[f2]=f1;
top--;
}
}
kluska();
}
}
hdu1102 最小生成树
最新推荐文章于 2019-06-01 13:47:57 发布