poj1734 最小环+输出路径

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define INF 9999999999
#define MAXN 305
using namespace std;

long long n,m,ans;
long long p[305][305],dis[305][305],pos[305][305];
vector<int>q;

void get(int x,int y){
    if(pos[x][y]==0)return;
    get(x,pos[x][y]);
    q.push_back(pos[x][y]);
    get(pos[x][y],y);
}

int main(){
    while(scanf("%lld%lld",&n,&m)==2){
        ans=INF;
        memset(pos,0,sizeof(pos));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                p[i][j]=dis[i][j]=INF;
        
        for(int i=1;i<=m;i++){
            long long x,y,z;
            scanf("%lld%lld%lld",&x,&y,&z);
            p[x][y]=p[y][x]=min(p[y][x],z);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                dis[i][j]=p[i][j];
            }
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<k;i++){
                for(int j=i+1;j<k;j++){
                    if(ans>=dis[i][j]+p[i][k]+p[k][j]){
                        ans=dis[i][j]+p[i][k]+p[k][j];
                        q.clear();
                        q.push_back(i);
                        get(i,j);
                        q.push_back(j);
                        q.push_back(k);
                                        
                    }
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(dis[i][j]>dis[i][k]+dis[k][j]){
                        dis[i][j]=dis[i][k]+dis[k][j];
                        pos[i][j]=k;
                    }
                }
            }
        }
        if(ans==INF){
        cout<<"No solution."<<endl;
        continue;    
        }
        for(int i=0;i<q.size();i++)cout<<q[i]<<' ';
        cout<<endl;
    }
}
View Code

嘛,考虑递归输出   只要记录  中转点   然后就ok了

猜你喜欢

转载自www.cnblogs.com/shatianming/p/12295887.html