Timus_1227_Rally Championship
题目大意:给一个M给节点,N条边的无向图。问是否存在长度 >= S的一条路径。每条边一旦被选择,就只能从固定的一个方向通过。1 ≤ M ≤ 100; 1 ≤ N ≤ 10000; 1 ≤ S ≤ 10^6.
显然,如果存在回路必然可以,且注意可能存在重边。那么我们就可以对每个节点做一遍dfs。在dfs的过程中判断是否存在回到该点的回路,如果不存在就能得到由该点出发的最长路了,注意更新答案就行了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MN = 110;
int map[MN][MN] = {0};
bool f[MN] = {0};
int n, m, s, root;
bool flag = false;
void dfs(int rt, int ds) {
if (flag) return;
if (ds >= s) {
flag = true;
return;
}
for (int i = 1; i <= m; i++) {
if (!f[i] && map[rt][i]) {
int tmp = map[rt][i];
map[rt][i] = map[i][rt] = 0;
f[i] = true;
if (i == root) {
flag = true;
return;
}
dfs(i, ds+tmp);
map[rt][i] = map[i][rt] = tmp;
f[i] = false;
if (flag) return;
}
}
}
int main() {
cin >> m >> n >> s;
int u, v, dis;
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &u, &v, &dis);
if (!map[u][v]) {
map[u][v] = map[v][u] = dis;
} else {
flag = true;
}
}
for (int i = 1; i <= m; i++) {
if (flag) break;
memset(f, false, sizeof(f));
root = i;
dfs(i, 0);
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}