uva10048 floyd或者kruscal

    xiaoxiao2021-03-26  18

    /* 题目大意: 从a点到b点, 找到一条路径,使得这条路径上的所有噪音中最大的值是所有路径中最小的, 这个噪音值便是要求的。若不连通,输出no path 方法1:floyd算法,改变map[i][j]的含义,改变松弛条件: map[i][j] = min(map[i][j], max(map[i][k], map[k][j])); 方法2:kruscal算法,先对边排序,然后从小到大加边。如果start与endd相连,更新ans。 */ /* #include <cstdio> #include <algorithm> #define N 105 using namespace std; const int inf = 0x3f3f3f3f; int map[N][N]; int n, m, q; void floyd() { for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (map[i][k] < inf && map[k][j] < inf) map[i][j] = min(map[i][j], max(map[i][k], map[k][j])); } } } } int main() { int cas = 0; while (scanf("%d%d%d", &n, &m, &q) != EOF && (n || m || q)) { if (cas) printf("\n"); printf("Case #%d\n", ++cas); int t1, t2, t3; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) map[i][j] = 0; else map[i][j] = inf; } } for (int i = 1; i <= m; i++) { scanf("%d%d%d", &t1, &t2, &t3); if(map[t1][t2] > t3) map[t1][t2] = map[t2][t1] = t3; } floyd(); int start, endd; while (q--) { scanf("%d%d", &start, &endd); if (map[start][endd] >= inf) printf("no path\n"); else printf("%d\n", map[start][endd]); } } return 0; } */ #include <cstdio> #include <algorithm> #define N 105 using namespace std; const int inf = 0x3f3f3f3f; typedef struct note { int u; int v; int w; }edge; edge e[N * 10]; int n, m, q; int f[N]; void init() { for (int i = 1; i <= n; i++) f[i] = i; } int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); } int merge(int x, int y) { int t1, t2; t1 = find(x); t2 = find(y); if (t1 != t2) { f[t2] = t1; return 1; } return 0; } int cmp(edge a, edge b) { return a.w < b.w; } int main() { int cas = 0; while (scanf("%d%d%d", &n, &m, &q) != EOF && (n || m || q)) { for (int i = 0; i < m; i++) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w); sort(e, e + m, cmp); int start, endd, ans; if (cas) printf("\n"); printf("Case #%d\n", ++cas); while (q--) { ans = inf; scanf("%d%d", &start, &endd); init(); for (int i = 0; i < m; i++) { merge(e[i].u, e[i].v); if (find(start) == find(endd)) { ans = e[i].w; break; } } if (ans == inf) printf("no path\n"); else printf("%d\n", ans); } } }
    转载请注明原文地址: https://ju.6miu.com/read-660530.html

    最新回复(0)