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.\n"); 47 printf("%d",find(1)); 48 return 0; 49 }