1030 Travel Plan (30 分)(最短路径 and dfs)

摘要:
#包括 使用namespacestd;组成N=510;组成f=0x3f3f3f;intmp[N][N];布尔维斯[N];intdis[N];整数,m,s,D;内部成本[N][N];向量<int>路径[N];voidDijkstra(){fill(vis,vis+N,false);fill(dis,dis+N,inf);对于(inti=0;i˂N;i++)dis[i]=mp[s][i];dis[s]=0;对于(inti=0;i˂N-1;i++){intu=-1;intminn=inf;对于(int j=0;j˂N;j++){if(!vis[j]&dis[j]˂minn){u=j;minn=dis[j];}}如果(u==-1)返回;vis[u]=真;对于(intj=0;j˂n;j++){if(!vis[j]&&dis[u]+mp[u][j]˂=dis[j]){如果(mp[u][j]+dis[u]0;i-){inta=t[i];intb=t[i-1];sum+=cost[a][b];}如果(sum˂minn){minn=sum;p=t;}t、 pop_ back();return;}t、 推回(v);for(inti=0;i =0;i-){printf(“%d”,p[i]);}printf(“%d%d”,dis[d],分钟);return0;}

1030 Travel Plan (30 分)(最短路径 and dfs)第1张

#include<bits/stdc++.h>

using namespace std;
const int N=510;
const int inf=0x3f3f3f3f;
int mp[N][N];
bool vis[N];
int dis[N];
int n,m,s,D;
int cost[N][N];
vector<int>path[N];
void Dijkstra()
{
    fill(vis,vis+N,false);
    fill(dis,dis+N,inf);
    for(int i=0;i<n;i++) dis[i]=mp[s][i];
    dis[s]=0;
    for(int i=0;i<n-1;i++){
        int u=-1;
        int minn=inf;
        for(int j=0;j<n;j++){
            if(!vis[j]&&dis[j]<minn){
                u=j;
                minn=dis[j];
            }
        }
        if(u==-1) return;
        vis[u]=true;
        for(int j=0;j<n;j++){
            if(!vis[j]&&dis[u]+mp[u][j]<=dis[j]){
                if(mp[u][j]+dis[u]<dis[j]){
                    dis[j]=mp[u][j]+dis[u];
                    path[j].clear();
                    path[j].push_back(u);
                }
                else{
                    path[j].push_back(u);
                }
            }
        }

    }
}
vector<int>t,p;
int minn=inf;
void dfs(int v)
{

    if(v==s){
        t.push_back(v);
        int sum=0;
        for(int i=t.size()-1;i>0;i--){
            int a=t[i];
            int b=t[i-1];
            sum+=cost[a][b];
        }
        if(sum<minn){
            minn=sum;
            p=t;
        }
        t.pop_back();
        return;
    }
    t.push_back(v);
    for(int i=0;i<path[v].size();i++){
        dfs(path[v][i]);
    }
    t.pop_back();

}
int main()
{
    fill(cost[0],cost[0]+N*N,0);
    fill(mp[0],mp[0]+N*N,inf);
    scanf("%d %d %d %d",&n,&m,&s,&D);
    while(m--){
        int a,b,c,d;
        scanf("%d %d %d %d",&a,&b,&c,&d);
        mp[a][b]=mp[b][a]=c;
        cost[a][b]=cost[b][a]=d;
    }
    Dijkstra();
    dfs(D);
    for(int i=p.size()-1;i>=0;i--){
        printf("%d ",p[i]);
    }
    printf("%d %d
",dis[D],minn);
    return 0;
}

免责声明:文章转载自《1030 Travel Plan (30 分)(最短路径 and dfs)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu 绿色(tar.gz)安装 nodejsPS抠图之单色背景图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ArcGIS 网络分析[1.2] 利用1.1的线shp创建网络数据集/并简单试验最佳路径

上篇已经创建好了线数据(shp文件格式)链接:点我 这篇将基于此shp线数据创建网络数据集。 在此说明:shp数据的网络数据集仅支持单一线数据,也就是说基于shp文件的网络数据集,只能有一个shp线文件参与。 如何解决这个弊端呢?见下篇,利用地理数据库即可。 本篇目录: 1. 创建网络数据集 2. 给网络数据集命名 3. 转弯 4. 连通性 5. 高程...

PostGIS拓扑:pgRouting最短路径分析

前提:在PostgreSQL中建立PostGIS数据库,安装pgRouting插件,导入现有的线表shp数据(示例使用的是管线pipesectionmain,其他的线表数据均可)。 1、pgRouting在edge表中添加字段 线表中必须有id,source,target,cost,the_geom 5个字段,其中现有空间数据表中的gid可作为id,sha...

UVA 690 PipelineScheduling 位运算+dfs+剪枝

一开始最容易想到间隔最多为n,但是结点还是太多了,需要优化。 预处理:预判一下并保存下一个可以放的位置距离之前的距离。这样可以减少很多判断。 最优化剪枝:如果当前长度+剩下没放的程序*最短间隔如果大于等于ans,那么对答案没有贡献,可以剪去。 优化:占用和不占用两种状态,如果横向来看可以压缩为int,判断时用上为运算。 此题挂在长度的枚举上,我把长度为n给...

Tarjan求割点

概述 在一个无向图中,若删除某个点u后连通分量数目增加,则称点u为该无向图的一个割点(cut vertex) 引理 无向连通图DFS树 从一个节点出发进行DFS,将后访问的结点设为前访问结点的孩子,DFS经过的边叫做DFS树的树边(tree edge),第一次处理时从后代(descendant)指向祖先(ancestor)的边叫做返祖边(back edge...

codeforces每日一题1-15

目录: 1.1093D. Beautiful Graph(DFS染色) 2.514C - Watto and Mechanism(Tire) 3.69E.Subsegments(STL) 4.25C. Roads in Berland(最短路松弛操作) 5.128B. String Problem (floyd预处理) 6.33C.Wonderful Ra...

4、BFS算法套路框架——Go语言版

前情提示:Go语言学习者。本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在: https://github.com/honlu/GoLabuladongAlgorithm https://gitee.com/dreamzll/G...