poj 1861(prim)
Posted 一个_小菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1861(prim)相关的知识,希望对你有一定的参考价值。
http://poj.org/problem?id=1861
题意:求最小生成树,并输出哪几个城市相连接,且输出一共有多少条边(一定是n-1条边),和最短边的长度
思路:直接prim,只不过在prim加点东西就可以,可以说是模板题,题目的案例是错的
答案应该是
1
3
1 2
1 3
2 4
1 #include <stdio.h> 2 #include <string.h> 3 #define inf 1000009 4 bool mark[1001]; 5 int a[1001][1001],dis[1001],ans,n,m; 6 int b[1001]; 7 int Min,Max; 8 9 int prim() 10 { 11 Min = 0,ans = 0; 12 for(int i=1;i<=n;i++) 13 dis[i]=inf;dis[1]=0; 14 for(int i=1;i<=n;i++){ 15 int tep=inf;int k=0; 16 for(int j=1;j<=n;j++){ 17 if(mark[j]&&dis[j]<tep) 18 { 19 tep=dis[j]; 20 k=j; 21 } 22 } 23 if(tep==inf) return 0; 24 if(tep>Min) 25 Min = tep; 26 mark[k]=false; 27 for(int j=1;j<=n;j++) 28 if(mark[j]&&dis[j]>a[k][j]) 29 { 30 b[j] = k; //用来记录哪两个城市相连接 31 dis[j]=a[k][j]; 32 } 33 } 34 return 0; 35 } 36 37 38 39 int main() 40 { 41 int x,y,z; 42 while(~scanf("%d%d",&n,&m)) 43 { 44 memset(a,inf,sizeof(a)); 45 memset(b,0,sizeof(b)); 46 memset(mark,true,sizeof(mark)); 47 while(m--) 48 { 49 scanf("%d%d%d",&x,&y,&z); 50 a[x][y] = z; 51 a[y][x] = z; 52 } 53 prim(); 54 printf("%d\n%d\n",Min,n-1); 55 for(int i = 1;i<=n;i++) 56 { 57 if(b[i]) 58 { 59 if(b[i]>i) 60 printf("%d %d\n",i,b[i]); 61 else printf("%d %d\n",b[i],i); 62 } 63 } 64 65 } 66 return 0; 67 }
以上是关于poj 1861(prim)的主要内容,如果未能解决你的问题,请参考以下文章
ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法