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)的主要内容,如果未能解决你的问题,请参考以下文章

POJ1861(Network)-Kruskal

ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法

POJ 1258 Agri-Net(Prim)

POJ 1789 -- Truck History(Prim)

POJ - 2421(最小生成树.prim)

poj2485prim