2018.09.15 poj1734Sightseeing trip(floyd求最小环)

本文介绍了一个基于递归求解的最短路径与最小费用流问题的算法实现,通过动态规划和图论的方法,寻找三个点之间的最短路径及总费用最小的方案。代码使用C++编写,详细展示了如何初始化数据结构、读取输入、更新距离矩阵以及回溯寻找具体路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hdu1599差不多.。
只是需要输出方案。
这个可以递归求解。
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#define inf 50005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int dis[105][105],f[105][105],ans;
int n,m,pred[105][105][105],ansi,ansj,ansk;
inline void solve(int k,int u,int v){
    if(!k){printf("%d",v);return;}
    if(pred[k][u][v]==-1){solve(k-1,u,v);return;}
    solve(k-1,u,k),putchar(' '),solve(k-1,k,v);
}
inline int min(int a,int b){return a<b?a:b;}
int main(){
    memset(pred,-1,sizeof(pred)),n=read(),m=read();
    for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)dis[i][j]=f[i][j]=inf;
    for(int i=1;i<=n;++i)dis[i][i]=f[i][i]=0;
    for(int i=1;i<=m;++i){
        int u=read(),v=read(),w=read();
        dis[u][v]=dis[v][u]=f[u][v]=f[v][u]=min(f[u][v],w);
    }
    ans=inf;
    for(int k=1;k<=n;++k){
        for(int i=1;i<k;++i)for(int j=1;j<k;++j){
                if(i==j)continue;
                if(dis[i][j]+f[i][k]+f[k][j]<ans)
                    ans=dis[i][j]+f[i][k]+f[k][j],ansi=i,ansj=j,ansk=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],pred[k][i][j]=k;
        }
    }
    if(ans==inf)puts("No solution.");
    else printf("%d %d ",ansk,ansi),solve(ansk-1,ansi,ansj);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值