parent
efdb5a1ad9
commit
4377432f83
@ -0,0 +1,36 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
#define inf 0x3f3f3f3f
|
||||
const int N = 510;
|
||||
int n, m, x, y, ans;
|
||||
int g[N][N];
|
||||
|
||||
void floyd() {
|
||||
for (int k = 1; k <= n; k++)
|
||||
for (int i = 1; i <= n; i++) {
|
||||
if (!g[i][k]) continue; // floyd优化
|
||||
for (int j = 1; j <= n; j++)
|
||||
g[i][j] |= g[i][k] & g[k][j]; // 通过k传递,或运算
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
int T;
|
||||
cin >> T;
|
||||
while (T--) {
|
||||
cin >> n >> m;
|
||||
memset(g, 0, sizeof g);
|
||||
while (m--) {
|
||||
cin >> x >> y;
|
||||
g[x][y] = 1; // x<y
|
||||
}
|
||||
// 计算传递闭包
|
||||
floyd();
|
||||
|
||||
ans = 0;
|
||||
for (int i = 1; i <= n; i++) // 统计答案
|
||||
for (int j = i + 1; j <= n; j++)
|
||||
if (!g[i][j] && !g[j][i]) ans++; // 无法确定大小关系
|
||||
cout << ans << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
#define inf 0x3f3f3f3f
|
||||
const int N = 310;
|
||||
int t, n, m, q, u, v, w;
|
||||
int mp[N][N];
|
||||
bool flag[N]; // 记录是否标记
|
||||
|
||||
void floyd(int k) {
|
||||
for (int i = 0; i < n; ++i)
|
||||
for (int j = 0; j < n; ++j)
|
||||
if (mp[i][j] > mp[i][k] + mp[k][j])
|
||||
mp[i][j] = mp[i][k] + mp[k][j];
|
||||
}
|
||||
int main() {
|
||||
while (cin >> n >> m >> q && n + m + q) {
|
||||
if (t != 0) printf("\n"); // 谜之格式
|
||||
printf("Case %d:\n", ++t);
|
||||
memset(mp, inf, sizeof(mp));
|
||||
memset(flag, false, sizeof(flag));
|
||||
for (int i = 0; i <= n; ++i)
|
||||
mp[i][i] = 0;
|
||||
while (m--) {
|
||||
scanf("%d %d %d", &u, &v, &w);
|
||||
if (w < mp[u][v])
|
||||
mp[u][v] = w;
|
||||
}
|
||||
while (q--) {
|
||||
scanf("%d", &w);
|
||||
if (w == 0) {
|
||||
scanf("%d", &u);
|
||||
if (flag[u])
|
||||
printf("ERROR! At point %d\n", u);
|
||||
else {
|
||||
flag[u] = true;
|
||||
floyd(u);
|
||||
}
|
||||
} else {
|
||||
scanf("%d %d", &u, &v);
|
||||
if (!(flag[u] && flag[v]))
|
||||
printf("ERROR! At path %d to %d\n", u, v);
|
||||
else if (mp[u][v] == inf)
|
||||
printf("No such path\n");
|
||||
else
|
||||
printf("%d\n", mp[u][v]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in new issue