畅通工程(自己写的BFS,但后面想了下并查集更好更快)

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

Input测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 
注意:两个城市之间可以有多条道路相通,也就是说 
3 3 
1 2 
1 2 
2 1 
这种输入也是合法的 
当N为0时,输入结束,该用例不被处理。 
Output对每个测试用例,在1行里输出最少还需要建设的道路数目。 
Sample Input

4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0

Sample Output

1
0
2
998个人做题心得:其实最后一个999,998就已经告诉我们了无论怎么通路,只要N个乡镇一定要有n-1条道路,这样子我们只要找出不重复的就好了,我用的是bfs这样就能把在一起连通的全部算起,不要求管其中路的多少,不过n个乡镇要建立标志循坏调用,时间还是比较慢的。而并查集则有树的概念,将在一起的数据全部弄成树的模型,这样的话就能够简单明了的将他们转化,最后只要得出谁没在这个体系中就加上去就好了。我的bfs题解
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 using namespace std;
 8 int n,m;
 9 int sum;
10 int mapa[1005][1005];
11 int book[1005];
12 void bfs(int x)
13 {
14     queue<int >s;
15      book[x]=1;
16      s.push(x);
17      while(!s.empty())
18         {
19             int t=s.front();
20             for(int i=1;i<=n;i++)
21                 {
22                     if(book[i]==0&&mapa[t][i]==1)
23                     {
24                         sum++;
25                         book[i]=1;
26                         s.push(i);
27                     }
28                 }
29                 s.pop();
30     }
31 }
32 int main()
33 {
34
35
36    while(cin>>n)
37    {
38        if(n==0) break;
39        scanf("%d",&m);
40        sum=0;
41        memset(mapa,0,sizeof(mapa));
42        memset(book,0,sizeof(book));
43        int x,y;
44        int flag=0;
45        for(int i=1;i<=m;i++)
46        {
47
48            scanf("%d%d",&x,&y);
49            if(flag==0) flag=x;
50            if(mapa[x][y]==0)
51                 mapa[x][y]=mapa[y][x]=1;
52
53
54        }
55        bfs(flag);
56        for(int i=1;i<=n;i++)
57        {
58            if(book[i]==0)
59              bfs(i);
60
61        }
62
63        if(sum>=n-1) printf("0\n");
64        else printf("%d\n",n-1-sum);
65    }
66
67     return 0;
68 }
并查集 1 #include<stdio.h>
 2 const int MAXN=1010;
 3 int F[MAXN];
 4 int find(int t)
 5 {
 6     if(F[t]==-1) return t;
 7     return F[t]=find(F[t]);
 8 }
 9 void bing(int a,int b)
10 {
11     int t1=find(a);
12     int t2=find(b);
13     if(t1!=t2) F[t1]=t2;
14 }
15 int main()
16 {
17     int n,m;
18
19     while(scanf("%d",&n),n)
20     {
21         scanf("%d",&m);
22         for(int i=1;i<=n;i++) F[i]=-1;
23         int a,b;
24         while(m--)
25         {
26             scanf("%d%d",&a,&b);
27             bing(a,b);
28         }
29         int res=0;
30         for(int i=1;i<=n;i++)
31           if(F[i]==-1) res++;
32         printf("%d\n",res-1);
33     }
34     return 0;
35 }
				
时间: 2024-10-06 10:25:58

畅通工程(自己写的BFS,但后面想了下并查集更好更快)的相关文章

hdu 1233(还是畅通工程)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

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

hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26860    Accepted Submission(s): 11985 Problem Description 某省调查乡村交通状况,得到的统计表中列出了随意两村庄间的距离.省政府"畅通project"的目标是使全省不论什么两个村庄间都能够实现公路交

还是畅通工程-最小生成树

原题链接:https://vjudge.net/problem/20289/origin 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( < 100 ):随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数

ACM: HDU 1874 畅通工程续-Dijkstra算法

HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多

【floyd】HDU 1874 畅通工程续

之后的题解偏重实用/总结性质,尽量理解算法本身而不是题,时间复杂度什么的也可以放放. 很久之前做过这个题,当时使用dijkstra做的,关于几个最短路算法,分类的话可以分为以下几种. 1.单源最短路:已知起点(终点),计算从源点到其他各个顶点的最短路径长度. 典型算法:Dijkstra,Bellman-Ford(可以算负的,比较慢),spfa(负权能用,加了松弛操作,速度比较炸天) 2.全局最短路:从一点到另一点,典型如Floyd,A*启发式算法. 重新用floyd写一遍: #include <

D - 继续畅通工程

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

HDU_1232《畅通工程》

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

hdoj-1879-继续畅通工程

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

HDU 1863:畅通工程(带权值的并查集)

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