zoukankan      html  css  js  c++  java
  • POJ1734 Sightseeing trip

    • Floyd求最小环裸题

    • 图中不能含有负权边,否则无最小环

    • 思路:Floyd的流程相当于不断枚举中转点k进行松弛操作,那么,把点的编号按从小到大排序,枚举到第k个中转点时,从i到j以 前k-1个点 作为中转点的最短路已确定,且一定不含环(因为不含有负权边),相当于一条链,用f(i,j)表示,原图中连接i,j两点的边用a(i,j)表示,那么

      (f(i,j)+a(i,k)+a(k,j) ot=infty) ,说明存在着一个经过i,j,k三个点的环,之后不断取最小值就可得到最小环。

      这种方法可能无法找出图中所有环,但因为是用最短路更新,一定能找到最小环。

    • 题目要求输出经过路径,记录每次更新后的前驱,递归输出路径。

    #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;
    }
    
  • 相关阅读:
    【leetcode】538/1038: 把二叉搜索树转化为累加树
    k8s-nginx二进制报Illegal instruction (core dumped)
    k8s-记一次安全软件导致镜像加载失败
    Ubuntu1804下k8s-CoreDNS占CPU高问题排查
    Ubuntu 18.04 永久修改DNS的方法
    NLP资源
    《转载》14种文本分类中的常用算法
    PyCharm 使用技巧
    python模块包调用问题
    强化学习(8)------动态规划(通俗解释)
  • 原文地址:https://www.cnblogs.com/yu-xing/p/10423777.html
Copyright © 2011-2022 走看看