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 }
时间: 2024-11-04 22:58:48

poj 1861(prim)的相关文章

POJ 2253-Frogger (Prim)

题目链接:Frogger 题意:两只青蛙,A和B,A想到B哪里去,但是A得弹跳有限制,所以不能直接到B,但是有其他的石头作为过渡点,可以通过他们到达B,问A到B的所有路径中,它弹跳最大的跨度的最小值 PS:最小生成树过的,刚开始用Dijstra做,Kao,精度损失的厉害,对于Dijksra的变形不大会变啊,看了Discuss有人用最小生成树过,我一划拉,还真是,敲了,就过了,等会研究研究最短路的各种变形,有模板不会变,不会灵活应用,渣渣就是渣渣. ME               Time 10

poj 1861(最小生成树)

Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the company, they can be connected to each other using cables. Since each worker of the company must have access

H - Highways - poj 1751(prim)

某个地方政府想修建一些高速公路使他们每个乡镇都可以相同通达,不过以前已经修建过一些公路,现在要实现所有的联通,所花费的最小代价是多少?(也就是最小的修建长度),输出的是需要修的路,不过如果不需要修建就什么都不输出. 分析:构建一个完全图,使用krusal进行一些简单优化不知道可以不,试一下吧 已经T成狗了 下面是TLE的krusal代码 ****************************************************************************** #

poj 1751 Highways (prim )

Highways Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9080   Accepted: 2536   Special Judge Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor system of public highways. The Flatopian

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

1.概念:给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 2.应用:例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低.这就需要找到带权的最小生成树. 3.求最小生成树的算法 3.1 普里姆(Prim)算法 方法:从指定顶点开始将它加入集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树

POJ 2352 (stars)

[题意描述] 就是给定n个星星的x,y坐标,y坐标按照从小到大的顺序进行排列,x坐标随机排列.下面求对于每个星星而言,其它星星的x,y的坐标都小于等于该星星的数目,然后输出所有的情况. [思路分析] 我们这道题可以采用树状数组求解,将x+1作为树状数组的底标. [AC代码] #include<iostream> #include<bitset> #include<cstdio> #include<cstring> #include<algorithm&

poj Sudoku(数独) DFS

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13665   Accepted: 6767   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure.

HDU 4081 Qin Shi Huang&#39;s National Road System(prim)

Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5153    Accepted Submission(s): 1795 Problem Description During the Warring States Period of ancient China(4

POJ 3419 (rmq)

这道题是rmq,再加上一个解决溢出. 刚开始我也想过用rmq,虽然不知道它叫什么,但是我知道应该这样做.可是后来没想到这道题的特殊性,也就是解决溢出的方法,就放弃了. rmq可以用线段树,也可以用dp.  这道题都可以过的,而且线段树要快一些. #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define m