P1394 山上的国度

题目描述

有一个神秘的小国坐落在南方的青山之上,只有当黄昏时,落日耀眼的余晖刺破薄雾的遮拦,有机缘者才可看到小山上面的n个美丽的村庄。

传说这个古老的国家里有m条枢纽管道,每一条苍老的管道连接着两个村庄,千百年来为村民提供水源的流通。

n个村庄里只有一个水库,从有水库的村庄通过这些枢纽管道向其它村庄提供水源。大家都明白水往低处流,所有村庄都能得到水库的供水。

黄小明就是那个有机缘者,同时他也是个偏执狂(把小猫绑在一起的那个变态小明),他迫切的想要知道水库应该在哪一个村庄,你能帮他解决疑惑吗?

输入输出格式

输入格式:

 

第一行输入n,m<=300。第二行输入n个正整数,第i个数表示第i个村庄的海拔。之后m行每行两个数表示这两个村庄之间有一条道路。(同海拔之间不能相互流水)

 

输出格式:

 

若存在这样的村庄,输出两行:

第一行为“Oui, j'ai trouve la solution.”。

第二行为村庄的编号。

若不行,请输出“Non”(不包括引号,可参见样例)

输入输出样例

输入样例#1: 复制
4 2
1 2 3 4
1 2
3 4
输出样例#1: 复制
Non

 

紫色诱惑三:

题意挺明确的,

思路也挺明确的,,吧。、

并查集,找祖先。


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int n,m,x,y;
 9 int a[302],fa[302];
10 
11 int find(int s)
12 {
13     if(fa[s]==s) return s;
14     else return fa[s]=find(fa[s]);
15 }
16 
17 void connect(int x,int y)
18 {
19     x=find(x);
20     y=find(y);
21     fa[x]=y;
22 }
23 
24 int main()
25 {
26     scanf("%d%d",&n,&m);
27     for(int i=1;i<=n;++i)
28     {
29         scanf("%d",&a[i]);
30         fa[i]=i;
31     }    
32     for(int i=1;i<=m;++i)
33     {
34         scanf("%d%d",&x,&y);
35         if(a[x]>a[y]) connect(y,x);   //如果x的海拔>y的海拔,那么就让y的祖先=x的祖先。
36         else connect(x,y);            //相反。
37     }
38     for(int i=2;i<=n;++i)
39     {
40         if(find(i)!=find(i-1))        //判断每个点的祖先是否都一样。
41         {
42             printf("Non");
43             return 0;
44         }
45     }
46     printf("Oui, j'ai trouve la solution.
");
47     printf("%d",find(1));
48     return 0;
49  } 


 
原文地址:https://www.cnblogs.com/Mary-Sue/p/9126116.html