首先,贴上一个很好的讲解贴:

http://www.wutianqi.com/?p=3012

 


HDOJ 1233 还是畅通工程

http://acm.hdu.edu.cn/showproblem.php?pid=1233

裸的Prim...

 1 #include<cstdio>
 2 #define MAXN 105
 3 #define INF 0x3f3f3f3f
 4 int map[MAXN][MAXN];
 5 int dist[MAXN];
 6 int vis[MAXN];
 7 int n,a,b,x,ans,tot;
 8 void init()
 9 {
10     for(int i=1;i<=n;i++)
11     {
12         for(int j=1;j<=n;j++)
13         {
14             if(i==j) map[i][j]=0;
15             else map[i][j]=INF;
16         }
17         vis[i]=0;
18         dist[i]=INF;
19     }
20 }
21 void Prim()
22 {
23     tot=0;ans=0;
24     for(int i=1;i<=n;i++)
25     {
26         if(map[1][i]<INF)
27             dist[i]=map[1][i];
28     }
29     vis[1]=1;
30     int tmp,u=1,flag;
31     for(int i=1;i<=n;i++)
32     {
33         tmp=INF;flag=0;
34         for(int j=1;j<=n;j++)
35         {
36             if(!vis[j]&&dist[j]<tmp)
37             {
38                 flag=1;
39                 tmp=dist[j];
40                 u=j;
41             }
42         }
43         vis[u]=1;
44         if(flag) ans+=dist[u];
45         for(int j=1;j<=n;j++)
46         {
47             if(!vis[j]&&map[u][j]<dist[j])
48                 dist[j]=map[u][j];
49         }
50     }
51 }
52 int main()
53 {
54     while(scanf("%d",&n)!=EOF)
55     {
56         if(n==0) break;
57         init();
58         for(int i=0;i<n*(n-1)/2;i++)
59         {
60             scanf("%d%d%d",&a,&b,&x);
61             if(map[a][b]>x)//可能有重边,要取最小的,开始没加这个WA
62             {
63                 map[a][b]=x;
64                 map[b][a]=x;
65             }
66         }
67         Prim();
68         printf("%d\n",ans);
69     }
70     return 0;
71 }
View Code

相关文章:

  • 2021-09-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-02
  • 2022-12-23
  • 2021-10-20
  • 2021-12-26
猜你喜欢
  • 2021-07-04
  • 2021-12-22
  • 2021-09-24
  • 2021-09-27
  • 2021-06-28
  • 2021-07-17
  • 2021-12-03
相关资源
相似解决方案