https://www.luogu.com.cn/problem/P1394
有一个神秘的小国坐落在南方的青山之上,只有当黄昏时,落日耀眼的余晖刺破薄雾的遮拦,有机缘者才可看到小山上面的 n n n 个美丽的村庄。
传说这个古老的国家里有 m m m 条枢纽管道,每一条苍老的管道连接着两个村庄,千百年来为村民提供水源的流通。
n n n 个村庄里只有一个水库,从有水库的村庄通过这些枢纽管道向其它村庄提供水源。大家都明白水往低处流,所有村庄都能得到水库的供水。
黄小明就是那个有机缘者,同时他也是个偏执狂(把小猫绑在一起的那个变态小明),他迫切的想要知道水库应该在哪一个村庄,你能帮他解决疑惑吗?
第一行输入 n , m n,m n,m( n , m ≤ 300 n,m \leq 300 n,m≤300)。
第二行输入 n n n 个正整数,第 i i i 个数表示第 i i i 个村庄的海拔。之后 m m m 行每行两个数表示这两个村庄之间有一条道路。(同海拔之间不能相互流水)
若存在这样的村庄,输出两行:第一行为 Oui, j'ai trouve la solution.,第二行为村庄的编号。
否则,请输出 Non。
4 2
1 2 3 4
1 2
3 4
Non
模拟+BFS就完了
别忘记数组初始化
别忘记数组初始化
别忘记数组初始化
#include
using namespace std;
const int maxn=3e2+10;
int n,m;
bool flag;
int a[maxn],que[maxn];
vector<int>e[maxn];
bool vis[maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
if(a[u]<a[v])e[v].push_back(u);
else if(a[u]>a[v])e[u].push_back(v);
}
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
int head=0,tail=0;
vis[i]=true;
que[tail++]=i;
while(head<tail){
int x=que[head++];
for(int i=0;i<e[x].size();i++){
if(!vis[e[x][i]]){
vis[e[x][i]]=true;
que[tail++]=e[x][i];
}
}
}
bool op=true;
for(int i=1;i<=n;i++){
if(!vis[i]){
op=false;
break;
}
}
if(!op)continue;
if(!flag){
flag=true;
printf("Oui, j'ai trouve la solution.\n");
}
printf("%d ",i);
}
if(!flag)printf("Non\n");
return 0;
}