HDOJ2120 Ice_cream's world I
2017-11-25 23:42
274 查看
Ice_cream's world I
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1830 Accepted Submission(s): 1060
[align=left]Problem Description[/align]
ice_cream's world is a rich country, it has many fertile lands. Today, the queen of ice_cream wants award land to diligent ACMers. So there are some watchtowers are set up, and wall between watchtowers be build, in order to partition
the ice_cream’s world. But how many ACMers at most can be awarded by the queen is a big problem. One wall-surrounded land must be given to only one ACMer and no walls are crossed, if you can help the queen solve this problem, you will be get a land.
[align=left]Input[/align]
In the case, first two integers N, M (N<=1000, M<=10000) is represent the number of watchtower and the number of wall. The watchtower numbered from 0 to N-1. Next following M lines, every line contain two integers A, B mean between
A and B has a wall(A and B are distinct). Terminate by end of file.
[align=left]Output[/align]
Output the maximum number of ACMers who will be awarded.
One answer one line.
[align=left]Sample Input[/align]
8 10
0 1
1 2
1 3
2 4
3 4
0 5
5 6
6 7
3 6
4 7
[align=left]Sample Output[/align]
3
题目大意:富裕的ice_cream女王 要给ACMers分地,女王的土地中有很多瞭望塔,女王命令下人在瞭望塔 与瞭望塔之间建立笔直的围墙,被围墙圈起来的土地可以用来奖励ACMers,但是女王不知道最多能奖励多少ACMers,请你来帮忙。
这个题目是使用并查集来做的。关于并查集,我推荐两篇比较好的相关博文:
https://segmentfault.com/a/1190000004023326
http://blog.csdn.net/dm_vincent/article/details/7655764
不知道为何我使用的java挂了,而使用C++的时候,同样的方法就AC了
下面给出代码:
#include<cstdio> int tree[1111],count=0; int find(int x) { int r=x; while(r!=tree[r]) r=tree[r]; return r; } void megre(int a,int b) { int fa,fb; fa=find(a); fb=find(b); if(fa!=fb) tree[fa]=fb; else count++; } int main() { int n,m,a,b,i; while(scanf("%d%d",&n,&m)!=EOF) { count=0; for(i=0;i<n;i++) tree[i]=i; while(m--) { scanf("%d%d",&a,&b); megre(a,b); } printf("%d\n",count); } return 0; }
import java.util.Scanner; //并查集暂时并不是理解的很深刻,这个是WA了,但不知道为何 //如果有知道的朋友,希望能解答一下 public class Main{ private static Scanner scanner; private static int tree[]; private static int count; public static void main(String[] args) { scanner = new Scanner(System.in); while(scanner.hasNext()){ count = 0;//一定要归零,不然每个例子都会一直加,就WA了 int n = scanner.nextInt(); int m = scanner.nextInt(); tree = new int[1111]; for (int i = 0; i < n; i++) { tree[i] = i; } for (int i = 0; i < m; i++) { int a = scanner.nextInt(); int b = scanner.nextInt(); connect(a,b); } System.out.println(count); } } private static void connect(int a, int b) { int ca = find(a); int cb = find(b); if(ca != cb){ tree[ca] = cb; }else {//如果围成了一圈,就++ count++; } } private static int find(int a) { int num = a; while(num != tree[num]){ num = tree[num]; } return num; } }
相关文章推荐
- HDOJ-2120 Ice_cream's world I
- HDOJ 2120 Ice_cream's world I
- hdoj 2120 Ice_cream's world I
- hdoj 2120 Ice_cream's world I 【并查集判断成环数】
- HDOJ题目2120 Ice_cream's world I(并查集)
- HDOJ 2120 Ice_cream's world I (并查集)
- HDOJ 2120 Ice_cream's world I(并查集)
- hdoj2120 Ice_cream's world I【并查集】
- hdoj--2120--Ice_cream's world I(并查集判断环)
- HDOJ 2120 Ice_cream's world I【判断环的个数】
- HDOJ 2120 Ice_cream's world I
- hdoj 2120 Ice_cream's world I 【并查集判断成环数】
- HDOJ 2120 Ice_cream's world I(并查集)
- HDU 2120 Ice_cream's world I
- hdu-2120 Ice_cream's world I
- HDOJ 2122 Ice_cream’s world III【Prime】&【Kruskal】
- Ice_cream's world I hdu 2120 并查集判断环
- hdoj 2121 Ice_cream’s world II 【没有最低树的根节点】
- hdu 2120 Ice_cream's world I(判断是否有环,简单的并查集)
- 【杭电】[2120]Ice_cream's world I