水库选址 link
话说在比赛中我怎么就炸了???
思路:
考虑水往低处流,那一定水库建在最高处。
那我将high从高到低排序,并依次判断是否相邻两个城市有联通。
如果没有,输出“No”。
反之输出“Yes”和最高点。
但是数据离奇,只给我过一个点
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3e2 + 10;
int n, m, u, v, a[N];
bool f[N][N];
bool cmp(int a, int b) { return a > b; }
int main() {
freopen("water.in", "r", stdin);
freopen("water.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n, cmp);
for (int i = 1; i <= m; i++) scanf("%d%d", &u, &v), f[u][v] = f[v][u] = 1;
for (int i = 2; i <= n; i++) {
if (a[i] == a[i - 1] || !f[a[i - 1]][a[i]]) {
printf("No\n");
return 0;
}
}
printf("Yes\n%d\n", a[1]);
return 0;
}
请大佬帮忙看看哪错了?
正解思路:
其实比较好想到,考虑用dfs遍历各点,
要求只能从高到低遍历,最后判断一下每个点是否都有被遍历到即可!
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3e2 + 10;
struct node {
int u, v, next;
} e[N * 2];
int n, m, u, v, a[N], maxh, tot, h[N];
bool vis[N];
void add(int x, int y) { e[++tot] = (node){ x, y, h[x] }, h[x] = tot; }
void dfs(int x) {
if (vis[x])
return;
vis[x] = 1;
for (int i = h[x]; i; i = e[i].next) dfs(e[i].v);
}
int main() {
freopen("water.in", "r", stdin);
freopen("water.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), maxh = (a[i] > a[maxh]) ? i : maxh;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
if (a[u] > a[v]) //只将高处向低处连边,限制dfs只能从高往低遍历。
add(u, v);
if (a[v] > a[u])
add(v, u);
}
dfs(maxh);
for (int i = 1; i <= n; i++)
if (!vis[i]) {
printf("No\n");
return 0;
}
printf("Yes\n%d", maxh);
return 0;
}