HDU 2122

题目大意很简单

就是给你城市的数量,和可以修建的铁路及其长度,如果连通,输出最小的总长,否则输出impossible

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2122

我用的prim算法一直报错也不知道为什么,后来改用Kruscal算法就好了~~T T;

正确代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 1010
 7 #define LL long long
 8 
 9 int n,M,S,T,C,t,k;
10 LL ans;
11 int fa[N];
12 
13 struct Path{
14     int x,y,d;
15     bool operator<(const Path &m)const{
16         return d<m.d;
17     }
18 }path[10010];
19 
20 int getHead(int x)
21 {
22     int a=x;
23     while(x!=fa[x]) x=fa[x];
24     fa[a]=x;
25     return x;
26 }
27 
28 bool Union(int x,int y)
29 {
30     int fa_x=getHead(x);
31     int fa_y=getHead(y);
32     if(fa_x==fa_y) return false;
33     fa[fa_x]=fa_y;
34     return true;
35 }
36 
37 int main()
38 {
39     while(scanf("%d%d",&n,&M)!=EOF){
40         t=0,k=0,ans=0;
41         for(int i=0;i<n;i++) fa[i]=i;
42         if(n==0) {cout<<0<<endl;continue;}
43             //cout<<MAXN<<endl;
44         for(int i=0;i<M;i++)  scanf("%d%d%d",&S,&T,&C),path[k].x=S,path[k].y=T,path[k++].d=C;
45         sort(path,path+k);
46 
47         for(int i=0;i<k;i++){
48             if(Union(path[i].x,path[i].y))
49                 ans+=path[i].d,t++;
50         }
51 
52         if(t==n-1) cout<<ans<<endl;
53         else cout<<"impossible"<<endl;
54         cout<<endl;
55     }
56     return 0;
57 }

错误的还未能改正好的代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 #define N 1010
 6 #define MAXN 1000000000
 7 #define LL long long
 8 int n,M,S,T,C,count;
 9 LL ans;
10 int visit[N],d[N];
11 int map[N][N];
12 
13 void prim()
14 {
15     int Min,MinIndex;
16     memset(visit,0,sizeof(visit));
17     ans=0;
18     visit[0]=1,count=1;
19     for(int i=1;i<n;i++) d[i]=map[0][i];
20 
21     for(int i=0;i<n-1;i++)
22     {
23         Min=MAXN,MinIndex=1;
24 
25         for(int i=1;i<n;i++)
26             if(!visit[i]&&Min>d[i])
27                 Min=d[i],MinIndex=i;
28 
29         visit[MinIndex]=1;
30         if(Min<MAXN) ans+=Min,count++;//cout<<Min<<' ';
31         //cout<<ans<<endl;
32         for(int i=1;i<n;i++)
33             if(!visit[i]&&d[i]>map[i][MinIndex])
34                 d[i]=map[i][MinIndex];
35     }
36 }
37 
38 int main()
39 {
40     while(scanf("%d%d",&n,&M)!=EOF){
41         if(n==0) {cout<<0<<endl;continue;}
42             //cout<<MAXN<<endl;
43         for(int i=0;i<n;i++){
44             for(int j=0;j<n;j++)
45                 map[i][j]=MAXN;
46         }
47         for(int i=0;i<M;i++)  scanf("%d%d%d",&S,&T,&C),map[S][T]=C,map[T][S]=C;;
48 
49         prim();
50 
51         /*for(int i=0;i<n;i++){
52             for(int j=0;j<n;j++)
53                 cout<<map[i][j]<<' ';
54             cout<<endl;
55         }*/
56 
57         if(count==n) cout<<ans<<endl;
58         else cout<<"impossible"<<endl;
59         cout<<endl;
60     }
61     return 0;
62 }
View Code
原文地址:https://www.cnblogs.com/CSU3901130321/p/3869799.html