POJ1734

来源:互联网 发布:sql在哪停止 编辑:程序博客网 时间:2024/06/05 16:44

Problem : Sightseeing trip
Description : 有一个旅行机构要设计一条旅行路线,这条路线要从一个地点出发最后回到这个点,而且路径长度要最短。
Solution : 裸最小环。参考最小环算法。
Code(C++) :

#include <stdio.h>#include <string.h>#define MIN(a,b) ((a)>(b)? (b):(a))const int SIZE=100+5;const int INF=1e7;int N,M;int map[SIZE][SIZE];int dp[SIZE][SIZE];int pre[SIZE][SIZE];int ans;int path[SIZE];int top;void floyd(){    int i,j,k;    for(k=1;k<=N;k++){        int tmp;        for(i=1;i<k;i++)            for(j=i+1;j<k;j++){                tmp=dp[i][j]+map[i][k]+map[k][j];                if(tmp<ans){                    ans=tmp;                    top=0;                    int p=j;                    while(p!=i)                        path[top++]=p,p=pre[i][p];                    path[top++]=i;                    path[top++]=k;                }            }        for(i=1;i<=N;i++)            for(j=1;j<=N;j++)                if(dp[i][j]>dp[i][k]+dp[k][j])                    dp[i][j]=dp[i][k]+dp[k][j],                    pre[i][j]=pre[k][j];    }}int main(){    //freopen("in.data","r",stdin);    int i,j;    while(~scanf("%d%d",&N,&M)){        int x,y,c;        for(i=0;i<SIZE;i++)            for(j=0;j<SIZE;j++)                dp[i][j]=map[i][j]=INF,pre[i][j]=i;        for(i=0;i<M;i++)            scanf("%d%d%d",&x,&y,&c),            map[x][y]=map[y][x]=dp[x][y]=dp[y][x]=MIN(map[x][y],c);        ans=INF;        top=0;        floyd();        if(ans>=INF)            puts("No solution.");        else            for(i=0;i<top;i++)                printf("%d%c",path[i],i==top-1? '\n':' ');    }    return 0;}
0 0