poj 2075=最小生成树Kruskal算法

来源:互联网 发布:ipad怎么备份所有数据 编辑:程序博客网 时间:2024/06/05 10:34

题意很好理解,但是应该注意映射,应该从1开始,因为不存在时返回0,边就要从1开始找,就这样wa了两次。

#include<cstdio>#include<cstring>#include<string>#include<iostream>#include<algorithm>#include<map>#define N 5000using namespace std;int p[N],u[N],v[N];double w[N];map<string,int>s;bool cmp(const int a,const int b){return w[a]<w[b];}int find(int x){return p[x]==x?x:p[x]=find(p[x]);}double kruskal(int n,int m){int i,j,r[N];double ans=0;for(i=0;i<n;i++)p[i]=i;for(i=1;i<=m;i++)r[i]=i;sort(r+1,r+m+1,cmp);for(i=1;i<=m;i++){int e=r[i];int x=find(u[e]);int y=find(v[e]);if(x!=y){ans+=w[e];p[x]=y;}}return ans;}int main(){int i,j,k,n,m;double lim,ans;char ch[50];cin>>lim;cin>>n;getchar();for(i=1;i<=n;i++){gets(ch);s[ch]=i;}cin>>m;getchar();for(i=1;i<=m;i++){scanf("%s",ch);u[i]=s[ch];getchar();scanf("%s",ch);v[i]=s[ch];scanf("%lf",&w[i]);getchar();}ans=kruskal(n,m);if(ans>lim)cout<<"Not enough cable\n";elseprintf("Need %.1f miles of cable\n",ans);return 0;}




原创粉丝点击