URAL 1004 Sightseeing Trip
2012-04-30 16:25
423 查看
URAL_1004
可以枚举起点和终点做O(N^2)次dij,也可以用floyd直接求最小环,但是用floyd的效率要高一些。
View Code (Floyd)
可以枚举起点和终点做O(N^2)次dij,也可以用floyd直接求最小环,但是用floyd的效率要高一些。
View Code (Floyd)
#include<stdio.h> #include<string.h> #define MAXD 110 #define INF 0x3f3f3f3f int N, M, g[MAXD][MAXD], f[MAXD][MAXD], p[MAXD][MAXD]; int q[MAXD], n; void init() { int i, j, k, x, y, z; memset(f, 0x3f, sizeof(f)); memset(g, 0x3f, sizeof(g)); for(i = 0; i < M; i ++) { scanf("%d%d%d", &x, &y, &z); if(z < g[x][y]) f[x][y] = f[y][x] = g[x][y] = g[y][x] = z, p[x][y] = y, p[y][x] = x; } } int Min(int x, int y) { return x < y ? x : y; } void solve() { int i, j, k, x, ans = INF; for(k = 1; k <= N; k ++) { for(i = 1; i < k; i ++) if(g[i][k] < ans) for(j = i + 1; j < k; j ++) if(g[k][j] < ans && f[i][j] + g[i][k] + g[k][j] < ans) { ans = f[i][j] + g[i][k] + g[k][j]; n = 0, x = i; while(x != j) { q[n ++] = x; x = p[x][j]; } q[n ++] = j; q[n ++] = k; } for(i = 1; i <= N; i ++) for(j = 1; j <= N; j ++) if(f[i][k] + f[k][j] < f[i][j]) f[i][j] = f[i][k] + f[k][j], p[i][j] = p[i][k]; } if(ans == INF) printf("No solution.\n"); else { printf("%d", q[0]); for(i = 1; i < n; i ++) printf(" %d", q[i]); printf("\n"); } } int main() { for(;;) { scanf("%d", &N); if(N == -1) break; scanf("%d", &M); init(); solve(); } return 0; }
相关文章推荐
- URAL - 1004 Sightseeing Trip(最小环)
- ural 1004 Sightseeing Trip
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- URAL1004 Sightseeing Trip Floyd 最小环
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- URAL 1004: Sightseeing Trip
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- Ural 1004 Sightseeing Trip
- URAL1004 Sightseeing Trip Floyd 最小环
- URAL - 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)
- URAL 1004 Sightseeing Trip(最小环)
- URAL - 1004 Sightseeing Trip(最小环)