constint N = 2010, M=1e4+10; // cnt 代表从原点到第i个节点经过的路程长度 int e[M], ne[M], h[N], idx, dist[N], w[M], cnt[N]; bool st[N]; queue<int> q; int n, m;
voidadd(int a, int b, int c){ e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; }
boolspfa(){ // 不需要初始化距离 因为这题不求绝对距离 // 这里需要把所有点都添加到队列中 // 因为负环可能处于从原点不可达的位置 for (int i = 1; i <= n; i++) q.push(i), st[i] = true; while (q.size()) { int t = q.front(); q.pop(); st[t] = 0; for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (dist[j] > dist[t] + w[i]) { dist[j] = dist[t] + w[i]; cnt[j] = cnt[t] + 1; if (cnt[j] >= n) returntrue; if (!st[j]) { st[j] = 1; q.push(j); } } } } returnfalse; }
intmain(){ memset(h, -1, sizeof h); cin >> n >> m; int a, b, c; while (m--) { cin >> a >> b >> c; add(a, b, c); } if (spfa()) cout << "Yes"; else cout << "No"; return0; }
constint N = 1010, M = 5010; int h[N], e[M], ne[M], w[M], f[N], idx; int n, m; int cnt[N]; bool st[N]; double dist[N];
voidadd(int a, int b, int c){ e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; }
boolspfa(double p){ queue<int> q; for (int i = 1; i <= n; i++) cnt[i] = 0, dist[i] = 0, st[i] = true, q.push(i); while (q.size()) { int t = q.front(); q.pop(); st[t] = false; for (int i = h[t]; ~i; i = ne[i]) { int j = e[i]; double wi = p*w[i]-f[t]; if (dist[j] > dist[t] + wi) { dist[j] = dist[t] + wi; cnt[j] = cnt[t] + 1; if (cnt[j] >= n) returntrue; if (!st[j]) st[j] = true, q.push(j); } } } returnfalse; }
intmain(){ cin >> n >> m; for (int i = 1; i <= n; i++) cin >> f[i]; memset(h, -1, sizeof h); while (m--) { int a, b, c; cin >> a >> b >> c; add(a, b, c); } double l = 0, r = 1000; while (r - l > 1e-3) { double mid = (l+r) / 2; if (spfa(mid)) l = mid; else r = mid; } printf("%.2lf", l); return0; }
单词环
我们有 n 个字符串,每个字符串都是由 a∼z 的小写英文字母组成的。
如果字符串 A 的结尾两个字符刚好与字符串 B 的开头两个字符相匹配,那么我们称 A 与 B 能够相连(注意:A 能与 B 相连不代表 B 能与 A 相连)。