zoukankan      html  css  js  c++  java
  • 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了

  • 相关阅读:
    Bean管理学习笔记
    Spring核心概念学习笔记
    Spring主要用到两种设计模式
    C# 值类型和引用类型等值判断
    嵌入式Linux之gdb配置和使用
    嵌入式Linux之telnet
    构建嵌入式Linux交叉编译工具链
    Linux动态库和静态库
    VxWorks BSP开发入门
    buildroot
  • 原文地址:https://www.cnblogs.com/shatianming/p/12295887.html
Copyright © 2011-2022 走看看