1392:繁忙的都市(city)

简介: 1392:繁忙的都市(city)

1392:繁忙的都市(city)

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。这些道路是双向的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:

1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。

2.在满足要求1的情况下,改造的道路尽量少。

3.在满足要求1、2的情况下,改造的那些道路中分值最大值尽量小。

作为市规划局的你,应当作出最佳的决策,选择那些道路应当被修建。

【输入】

第一行有两个整数n,m表示城市有n个交叉路口,m条道路。接下来m行是对每条道路的描述,u, v, c表示交叉路口u和v之间有道路相连,分值为c。(1≤n≤300,1≤c≤10000)。

【输出】

两个整数s, max,表示你选出了几条道路,分值最大的那条道路的分值是多少。

【输入样例】

4 5

1 2 3

1 4 5

2 4 7

2 3 6

3 4 8

【输出样例】

3 6

1. // 示例代码 Prim算法
2. #include <cstdio>
3. #include <cstring>
4. #include <iostream>
5. #include <stdio.h>
6. 
7. using namespace std;
8. 
9. const int N = 305;
10. int n, m, a, b, c, maxn = -0x7f7f7f7f;
11. int g[N][N]; //储存边权的临接矩阵
12. int minn[N]; //存储距离某个点最小的边权值
13. bool u[N];   //判断是否已被访问过
14. 
15. int main() {
16. // 输入
17. scanf("%d %d", &n, &m);
18. memset(g, 0x3f, sizeof(g));       // 初始化边权为无穷大
19. memset(minn, 0x3f, sizeof(minn)); // 赋最大值
20. memset(u, true, sizeof(u));       // 初始化为未被访问
21. 
22. for (int i = 1; i <= m; i++) {
23. scanf("%d %d %d", &a, &b, &c);
24.     g[a][b] = g[b][a] = c; // 添加双向边权
25.   }
26.   minn[1] = 0;
27. 
28. // Prim算法主体部分
29. for (int i = 1; i <= n; i++) {
30. int t = 0;
31. for (int j = 1; j <= n; j++) {
32. if (u[j] && minn[j] < minn[t])
33.         t = j; // 查找距离某个点最小的边
34.     }
35.     u[t] = false; // 将该点标记为已访问
36. 
37.     maxn = max(maxn, minn[t]); // 用一个变量记录最大边权值
38. 
39. for (int j = 1; j <= n; j++) {
40. if (u[j] && g[t][j] < minn[j])
41.         minn[j] = g[t][j]; // 更新该点到其他点的最小边权
42.     }
43.   }
44. 
45. // 输出答案
46. printf("%d %d", n - 1, maxn);
47. return 0;
48. }
1. // 示例代码 Kruskal算法
2. #include <algorithm>
3. #include <cstdio>
4. #include <cstring>
5. #include <iostream>
6. #include <stdio.h>
7. 
8. using namespace std;
9. 
10. const int N = 305;
11. int n, k, maxn=-0x7f7f7f7f, tj;
12. 
13. // 存储边的结构体
14. struct node {
15. int x, y, z;
16. } a[N * N];
17. 
18. // 求并查集中的祖先
19. int f[N];
20. int find(int x) {
21. if (f[x] == x)
22. return x;
23. return f[x] = find(f[x]);
24. }
25. 
26. // 边权排序函数
27. bool cmp(const node &a, const node &b) { return a.z <= b.z; }
28. 
29. int main() {
30. // 输入
31. scanf("%d %d", &n, &k);
32. for (int i = 1; i <= k; i++) 
33. scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].z);
34. 
35. // 初始化并查集
36. for (int i = 1; i <= n; i++)
37.     f[i] = i;
38. 
39. // 边权排序
40. sort(a + 1, a + k + 1, cmp);
41. 
42. // Kruskal算法主体部分
43. for (int i = 1; i <= k; i++) {
44. int fx = find(a[i].x);
45. int fy = find(a[i].y);
46. if (fx != fy) {
47.       f[fy] = fx;
48.       maxn=a[i].z;//记录道路分值 由于已排序所以不用比较
49.       tj++;
50.     }
51. if (tj == n - 1)
52. break;
53.   }
54. 
55. // 输出答案
56. printf("%d %d", n-1,maxn);
57. return 0;
58. }


相关文章
|
安全 自动驾驶 新能源
续航不到600公里的电动车,现在要被淘汰了​
它或许可以成为国产电动车的里程碑之作。
续航不到600公里的电动车,现在要被淘汰了​
单次搭载143颗人造卫星!SpaceX创一箭多星记录,太空拼车每200千克100万美元
单次搭载143颗人造卫星!SpaceX创一箭多星记录,太空拼车每200千克100万美元
175 0
吸烟场景运营商“烟客”获2000万元Pre-A轮融资,用于线下吸烟空间建设
传统的吸烟室通常只是一个简陋房间,空间狭小、设施老化、通风不畅、环境恶劣。
458 0
|
城市大脑 云栖大会
【云栖大会】城市大脑已接管杭州128个信号灯路口,救护车到达现场时间缩短一半
在阿里巴巴技术委员会主席王坚勾勒的蓝图中,未来城市大脑是城市重要的基础设施,以互联网、计算和数据为基础,实现可持续发展。治理交通拥堵只是城市大脑迈向城市治理、成为超级人工智能的第一步。
7861 0