您的位置:首页 > 其它

ACM_模板_最小生成树

2016-02-28 23:43 204 查看
最小生成树,其本质还是并查集,经典运用就是Kruskal算法,对边权进行排序后,由小到大进行合并处理,直到形成一颗树为止。

#include<stdio.h>//最小生成树
#include<algorithm>
using namespace std;
int root[101];
int N,Q,i,j,a,b,d,t,ans;
struct road
{
int s;
int e;
int d;
}edge[5051];
bool cmp(road a,road b)
{
return a.d<b.d;
}
int find(int a)
{
while(a!=root[a])
a = root[a];
return a;
}
void merge(int a,int b)
{
a = find(a);
b = find(b);
if(a != b)
root[b] = a;
}
int main()
{
while(scanf("%d",&N)!=EOF)
{
for(i=1;i<101;i++)
root[i] = i;
t = 0;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
scanf("%d",&d);
if(j>=i)continue;
edge[t].s = j;
edge[t].e = i;
edge[t].d = d;
t++;
}
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&a,&b);
merge(a,b);
}
sort(edge,edge+t,cmp);
ans = 0;
for(i=0;i<t;i++)
{
if(find(edge[i].s) != find(edge[i].e))
{
merge(edge[i].s,edge[i].e);
ans += edge[i].d;
}
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: