P1111修复公路

一、题目描述

  P1111修复公路

 

 二、题目分析

  如果n个村庄要想通村,而这个公路又是双向的,那么就只需要n-1条边就行了,因此我们只需要解决的问题就是时间最少的问题了,我们只需要按时间进行一个快排就行了,然后判断是否拿到了n-1条边,拿到了就更新ans推出循环就行了,如果修完了m条路都没有n-1条边,那么就不能通车,输出-1即可。

三、代码实现

  AC1

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 struct node{
 4     int x;
 5     int y;
 6     int t;
 7 }bucket[101100];
 8 int n,m;
 9 int windows[101100];
10 bool cmp(node a,node b)
11 {
12     return a.t < b.t;
13 }
14 int find(int u)
15 {
16     if(u == windows[u])
17         return windows[u];
18     return windows[u] = find(windows[u]);
19 }
20 void merge(int n,int m)
21 {
22     int t1,t2;
23     t1 = find(n);
24     t2 = find(m);
25     windows[t2] = t1;
26 }
27 int main()
28 {
29     cin >> n >> m;
30     int ans = -1;
31     for(int i = 1;i <= 5000;i++)
32         windows[i] = i;
33     for(int i = 0;i < m;i++)
34         cin >> bucket[i].x >> bucket[i].y >> bucket[i].t;
35     sort(bucket,bucket + m,cmp);
36     int cnt = n - 1;
37     for(int i = 0;i < m;i++){
38         if(find(bucket[i].x) != find(bucket[i].y)){
39             merge(bucket[i].x,bucket[i].y);
40             cnt--;
41         }
42         if(!cnt){
43             ans = bucket[i].t;
44             break;
45         }
46     }
47     cout << ans;
48     return 0;
49 }

   AC2 暴力查询即可,查询当前是否已经能够通车

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 struct node{
 4     int x;
 5     int y;
 6     int t;
 7 }bucket[101100];
 8 int n,m;
 9 int windows[101100];
10 bool cmp(node a,node b)
11 {
12     return a.t < b.t;
13 }
14 int find(int u)
15 {
16     if(u == windows[u])
17         return windows[u];
18     return windows[u] = find(windows[u]);
19 }
20 void merge(int n,int m)
21 {
22     int t1,t2;
23     t1 = find(n);
24     t2 = find(m);
25     windows[t2] = t1;
26 }
27 bool check()
28 {
29     for(int i = 1;i <= n;i++)
30         for(int j = i + 1;j <= n;j++)
31             if(find(i) != find(j))
32                 return false;
33     return true;
34 }
35 int main()
36 {
37     cin >> n >> m;
38     int ans = -1;
39     for(int i = 1;i <= 5000;i++)
40         windows[i] = i;
41     for(int i = 0;i < m;i++)
42         cin >> bucket[i].x >> bucket[i].y >> bucket[i].t;
43     sort(bucket,bucket + m,cmp);
44     for(int i = 0;i < m;i++){
45         merge(bucket[i].x,bucket[i].y);
46         if(check()){
47             ans = bucket[i].t;
48             break;
49         }
50     }
51     cout << ans;
52     return 0;
53 }
上一篇:EFDC是什么?环境流体动力学代码


下一篇:Warning: The resulting partition is not properly aligned for best performance