hdu1233 还是畅通工程 基础最小生成树

 1 //克鲁斯卡尔
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 10005;
 6 struct node
 7 {
 8     int begin, end, len;
 9 }cun[maxn];
10 int n, fa[maxn], ans, m;
11
12 bool cmp(node a, node b)
13 {
14     return a.len<b.len;  //按长度有小到大排序
15 }
16
17 void init()
18 {
19     for (int i = 0; i <= n; i++)
20     {
21         fa[i] = i;
22     }
23 }
24
25 int find(int x)
26 {
27     if (x == fa[x])
28         return fa[x];
29     else
30         return fa[x] = find(fa[x]);
31 }
32
33 void join(int a, int b)
34 {
35     a = find(a);
36     b = find(b);
37     if (a != b)
38         fa[b] = a;
39 }
40
41 int kruskal()
42 {
43     sort(cun, cun + m, cmp);
44     init();  //初始化并查集
45     ans = 0;
46     for (int i = 0; i<m; i++)
47     {
48         if (find(cun[i].begin) != find(cun[i].end)) //一条边的两个端点不在同一个集合,则选他,并合并
49         {
50             join(cun[i].begin, cun[i].end);
51             ans += cun[i].len;
52         }
53     }
54     return ans;
55 }
56
57 int main()
58 {
59     while (cin >> n)
60     {
61         if (n == 0) break;
62         m = n*(n - 1) / 2;
63         for (int i = 0; i<m; i++)
64             cin >> cun[i].begin >> cun[i].end >> cun[i].len;
65         cout << kruskal() << endl;
66     }
67     return 0;
68 }
 1 //prim
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 using namespace std;
 8
 9 #define INF 0x7fffffff
10 # define MAXN 120
11 typedef long long int LL;
12
13 LL n, m;
14 LL cmpa[MAXN][MAXN], book[MAXN], dis[MAXN];
15
16 int main()
17 {
18     LL a, b, weight, ans, p, q, f1, f2, minn, mark;
19     while (scanf("%I64d", &n) && n)
20     {
21         //初始化 这题prime算法合适,边那摩多,都是完全图了
22         for (LL i = 0; i<MAXN; i++)
23         {
24             dis[i] = INF;
25             for (LL j = 0; j<MAXN; ++j)
26                 cmpa[i][j] = INF;
27         }
28
29         memset(book, 0, sizeof(book));
30         ans = 0;
31
32         for (LL i = 0; i<n*(n - 1) / 2; ++i)
33         {
34             scanf("%I64d %I64d %I64d", &a, &b, &weight);
35             cmpa[a][b] = cmpa[b][a] = weight;
36         }
37
38         //连通图
39         book[1] = 1;
40         dis[1] = -1;
41
42         for (LL t = 1; t<n; ++t)
43         {
44             for (LL i = 2; i <= n; ++i)
45             {//更新dis中的值
46                 for (LL j = 1; j <= n; ++j)
47                 {
48                     if (book[j] && dis[i]>cmpa[i][j])
49                     {  //j在树中
50                         dis[i] = cmpa[i][j];
51                     }
52                 }
53             }
54
55             //选点建树
56             minn = INF, mark = 0;
57             for (LL i = 2; i <= n; ++i)
58             {
59                 if (book[i])
60                     continue;
61                 else
62                 {
63                     if (dis[i] < minn)
64                     {
65                         minn = dis[i];
66                         mark = i;
67                         }
68                 }
69             }
70
71             if (minn != INF)
72             {
73                 ans += minn;
74                 book[mark] = 1;
75                 dis[mark] = -1;
76             }
77
78         }
79         cout << ans << endl;
80
81     }
82     return 0;
83 }
时间: 2024-10-06 17:20:09

hdu1233 还是畅通工程 基础最小生成树的相关文章

HDU1233 还是畅通工程 【最小生成树Prim】

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25591    Accepted Submission(s): 11370 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路

hdu1863 畅通工程 基础最小生成树

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #define N 110 5 #define M 5000 6 using namespace std; 7 8 int n, m, u[M], v[M], w[M], r[M], p[N]; 9 bool cmp(int i, int j){ return w[i]<w[j]; } 10 int f(int x){ return

HDU1233 - 还是畅通工程 最小生成树,用了三种姿势AC

HDU1233 - 还是畅通工程 : http://acm.hdu.edu.cn/showproblem.php?pid=1233 用了三种姿势AC这题之后, 感觉对最小生成树的理解又更深了一层. 嗯, 让你们看看我用的是哪三种姿势 方法 1 : #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const in

hdoj 1863 畅通工程 【最小生成树】+【kruskal】

题意:... 难点:如何判断是不是信息不全:在输入的时候建立并查集,之后判断有几个节点就可以了,剩下的就是kruskal算法. 代码: #include<stdio.h> #include<string.h> #include<algorithm> #define MAXN 105 #define INF 0x3f3f3f3f using std::sort; struct node{ int from; int to; int w; }edges[MAXN*MAXN]

HDU 1863 畅通工程 (最小生成树)

Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间

HDU 1875 畅通工程再续 (最小生成树)

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14835    Accepted Submission(s): 4591 Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题

HDOJ 1233 还是畅通工程 【最小生成树】+【prim】

题意:... 策略:最最典型的prim算法. 代码: #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f #define MAXN 105 int map[MAXN][MAXN], di[MAXN], vis[MAXN]; int n; int prim() { int i, j, min, pos; memset(vis, 0, sizeof(vis)); memset(di, 0, sizeof(di)); p

HDU1879 继续畅通工程 【最小生成树Prim】

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13613    Accepted Submission(s): 5906 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

HDU1863 畅通工程 【最小生成树Prim】

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16722    Accepted Submission(s): 6987 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出