其他分享
首页 > 其他分享> > POJ1734 Sightseeing trip

POJ1734 Sightseeing trip

作者:互联网

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=310,inf=0x3f3f3f3f;
int a[maxn][maxn],f[maxn][maxn],pre[maxn][maxn];
int n,m,ans=inf;
vector<int> path;
void dfs(int i,int j){
    int k=pre[i][j];
    if(k==0) return;
    dfs(i,k);
    path.push_back(k);
    dfs(k,j);
}
int main(){
    scanf("%d%d",&n,&m);
    memset(a,0x3f,sizeof(a));
    for(int i=1;i<=n;++i) a[i][i]=0;
    for(int i=1,x,y,z;i<=m;++i){
        scanf("%d%d%d",&x,&y,&z);
        a[x][y]=a[y][x]=min(a[x][y],z);
    }
    memcpy(f,a,sizeof(a));
    for(int k=1;k<=n;++k){
        for(int i=1;i<k;++i){//注意这里枚举到k-1
            for(int j=i+1;j<k;++j){
                ll tmp=(ll)f[i][j]+a[j][k]+a[k][i];
                //3个0x3f3f3f3f相加会溢出,需要强制类型转换,不开longlong见祖宗!
                if(tmp<ans){
                    ans=tmp;
                    path.clear();
                    path.push_back(i);//以i为起点
                    dfs(i,j);//经过的路径 递归存入前驱
                    path.push_back(j);
                    path.push_back(k);
                }
            }
        }
        for(int i=1;i<=n;++i){
            for(int j=1;j<=n;++j){
                ll tmp=(ll)f[i][k]+f[k][j];
                if(tmp<f[i][j]){
                    f[i][j]=tmp;
                    pre[i][j]=k;//记录前驱
                }
            }
        }
    }
    if(ans==inf) puts("No solution.");
    else for(int i=0;i<path.size();++i) printf("%d ",path[i]);
    return 0;
}

标签:POJ1734,int,中转,最小,dfs,maxn,include,trip,Sightseeing
来源: https://www.cnblogs.com/yu-xing/p/10423777.html