您的位置:首页 > 其它

poj1251解题报告

2015-06-19 21:46 302 查看
题目大意:给你一个AOE网络,表示一个森林,有结点权(村庄编号),也有边权(费用),保持森林中每个村子都有道路相通,且维修所需要的最少money。

解题思路:MST最小生成树,kruska算法~~

没什么要注意的,我的算法改自刘汝佳的模板

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

const int maxn=1000;

int u[maxn],v[maxn],w[maxn],p[maxn],r[maxn],n,m;

int cmp(const int i,const int j) {return w[i]<w[j];}

int find(int x) {return p[x]==x?x:p[x]=find(p[x]);}

int kruskal()

{

int cou=0,x,y,i,ans=0;

for(i=0;i<n;i++) p[i]=i;

for(i=0;i<m;i++) r[i]=i;

sort(r,r+m,cmp);

for(i=0;i<m;i++)

{

int e=r[i];x=find(u[e]);y=find(v[e]);

if(x!=y) {ans += w[e];p[x]=y;cou++;}

}

if(cou<n-1) ans=0;

return ans;

}

int main()

{

//freopen("1.txt","r",stdin);

while(cin>>n)

{

m=0;

if(n==0) break;

for(int i =0;i<n-1;i++)

{

char a;

cin>>a;

int tmp;

cin>>tmp;

for(int j=0;j<tmp;j++)

{

char b;

cin>>b;

int tmp1;

cin>>tmp1;

u[m]=a-'A';

v[m]=b-'A';

w[m++]=tmp1;

}

}

cout<<kruskal()<<endl;

}

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