您的位置:首页 > 其它

URAL 1004 Sightseeing Trip

2012-04-30 16:25 423 查看
URAL_1004

可以枚举起点和终点做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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: