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

 

你可能感兴趣的:(HDU)