九度oj 题目1347:孤岛连通工程

题目描述:

现在有孤岛n个,孤岛从1开始标序一直到n,有道路m条(道路是双向的,如果有多条道路连通岛屿i,j则选择最短的那条),请你求出能够让所有孤岛都连通的最小道路总长度。

输入:

数据有多组输入。
每组第一行输入n(1<=n<=1000),m(0<=m<=10000)。
接着m行,每行输入一条道路i j d(0<=d<=1000),(i,j表示岛屿序号,d表示道路长度)。

输出:

对每组输入输出一行,如果能连通,输出能连通所有岛屿的最小道路长度,否则请输出字符串"no"。

样例输入:
3 5
1 2 2
1 2 1
2 3 5
1 3 3
3 1 2
4 2
1 2 3
3 4 1
样例输出:
3
no

求最小生成树
 1 #include <cstdio>
 2 #include <algorithm>
 3 #define max_v 1002
 4 #define max_m 10002
 5 struct Edge{
 6     int from, to, dis;
 7 };
 8 int par[max_v];
 9 int rank[max_v];
10
11 int cmp(const void *a, const void *b) {
12     Edge at = *(Edge *)a;
13     Edge bt = *(Edge *)b;
14     return at.dis - bt.dis;
15 }
16 int ini(int N) {
17     for(int i = 0; i <= N; i++) {
18         par[i] = i;
19         rank[i] = 0;
20     }
21 }
22 int find(int t) {
23     if(t == par[t]) {
24         return t;
25     }
26     else {
27         return par[t] = find(par[t]);
28     }
29 }
30
31 Edge e[max_m];
32 int n, m;
33 int main(int argc, char const *argv[])
34 {
35     freopen("input.txt","r",stdin);
36     while(scanf("%d %d",&n,&m) != EOF) {
37         for(int i = 0; i < m; i++) {
38             scanf("%d %d %d",&e[i].from, &e[i].to, &e[i].dis);
39         }
40         qsort(e, m, sizeof(Edge), cmp);
41         int ans = 0;
42         int cnt = 0;
43         ini(n);
44         for(int i = 0; i < m; i++) {
45             int a = e[i].from;
46             int b = e[i].to;
47             int c = e[i].dis;
48             //printf("%d %d %d\n",a,b,c);
49             a = find(a);
50             b = find(b);
51             if(a == b) {
52                 continue;
53             }
54             if(a != b) {
55                 ans = ans + c;
56                 if(rank[a] < rank[b]) {
57                     par[a] = b;
58                 }
59                 else {
60                     par[b] = a;
61                     rank[a]++;
62                 }
63                 cnt++;
64                 if(cnt == n-1) {
65                     break;
66                 }
67             }
68         }
69         if(cnt == n-1) {
70             printf("%d\n",ans);
71         }
72         else {
73             puts("no");
74         }
75     }
76     return 0;
77 }

时间: 2024-10-15 04:53:30

九度oj 题目1347:孤岛连通工程的相关文章

九度oj 题目1012:畅通工程

题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? 输入: 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号.为简单起见,城镇从1到N编号.     注意:两个城

&lt;九度 OJ&gt;题目1012:畅通工程

题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? 输入: 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号.为简单起见,城镇从1到N编号. 注意

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一

九度oj题目1009:二叉搜索树

题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出:                        如果序列相同则输出YES,否则输出NO 样

九度oj 题目1028:继续畅通工程

题目描述:     省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. 输入:     测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到

九度oj 题目1171:C翻转

题目描述: 首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据. 操作类型有四种:  1 2 表示:90度,顺时针,翻转4个数  1 3 表示:90度,顺时针,翻转9个数  2 2 表示:90度,逆时针,翻转4个数  2 3 表示:90度,逆时针,翻转9个数 输入: 输入有多组数据. 每组输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角

九度oj 题目1495:关键点

题目描述: 在一个无权图中,两个节点间的最短距离可以看成从一个节点出发到达另一个节点至少需要经过的边的个数. 同时,任意两个节点间的最短路径可能有多条,使得从一个节点出发可以有多条最短路径可以选择,并且沿着这些路径到达目标节点所经过的边的个数都是一样的. 但是在图中有那么一些特殊的节点,如果去除这些点,那么从某个初始节点到某个终止节点的最短路径长度要么变长,要么这两个节点变得不连通.这些点被称为最短路径上的关键点. 现给定一个无权图,以及起始节点和终止节点,要求输出该图上,这对节点间最短路径上的

九度oj 题目1481:Is It A Tree?

题目描述: A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties. There is exactly one node, called the root, to whic