博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
暑假 D4T1 path(反向建图 dijkstra)
阅读量:5098 次
发布时间:2019-06-13

本文共 3239 字,大约阅读时间需要 10 分钟。

Description

众所周知,Bfk 经常为找不到路而烦恼
Bfk 终于迎来了它高中以来第一个完整的暑假,它决定从假期里抽出一段时间去日本
旅游。可是,对于连教师宿舍都找不到的 Bfk 来说,在旅途中不迷路是一件很困难的事
情。为了避免迷路的尴尬,Bfk 早早的就规划起了它的行程。它将日本的地图抽象成了一
张 n 个点 m 条边的有向图,并在上面选定了行程的起点和终点,但它在规划旅行路径时却
犯了难。它希望路径上的点都满足该点的出边所指向的点都能直接或间接的到达终点,这
样即使它走错了路,也能重新规划路线到达终点。另外,它还希望旅行的路程尽可能短,
以便节约更多的时间预习大学课程。
现在,Bfk 找到了你,希望你能帮帮它。它不想为难你,因此你不用输出具体的方
案,只需要告诉它满足条件的路径的最短长度就可以了

Input

第一行两个整数 ? 和 ? ,含义如题
接下来 m 行,每行三个整数 ?, ?, ? ,描述一条从 ? 指向 ? 的单向边,长度为?
接下来一行两个整数 ?,?,表示起点和终点

Output

输出一行一个数字,表示满足要求的路径的最短长度
特别的,如果不存在这样的路径,则输出“-1”(不含引号)

题解

由于做过最优贸易,所以对于点到达终点的条件可以很容易转换,建立反图,从t跑。

考虑所有路径上的点满足出边的点都能到终点的条件,可以在dfs时记录到达该节点的次数,

该次数等同于这个点出边的点可以到t的个数。

最后再用满足条件的点建出正向的图,跑最短路即可。

于是愉快的spfa和只是大的大数据。

#include
using namespace std;const int maxn=100005;int n,m,s,t;vector
>e[maxn],a[maxn];int chu[maxn],cnt[maxn];template
inline void read(T &x){ x=0;char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}}void dfs(int u){ //printf("%d ",u); for(unsigned int i=0;i
q;bool vis[maxn];int dis[maxn];void spfa(){ for(int i=1;i<=n;i++) dis[i]=0x7ffffff; q.push(s); vis[s]=true;dis[s]=0; while(!q.empty()){ int x=q.front(); q.pop(); vis[x]=false; for(unsigned int i=0;i
dis[x]+e[x][i].second){ dis[y]=dis[x]+e[x][i].second; if(!vis[y]) {vis[y]=true;q.push(y);} } } }}int main(){ freopen("path.in","r",stdin); freopen("path.out","w",stdout); read(n);read(m); for(int i=1;i<=m;i++){ int x,y,z; read(x);read(y);read(z); if(x==y) continue; chu[x]++; a[y].push_back(make_pair(x,z)); } read(s);read(t); cnt[t]=1; dfs(t); //for(int i=1;i<=n;i++) printf("%d %d\n",cnt[i],chu[i]); if(!cnt[s]) {printf("-1");return 0;} cnt[t]=chu[t]; for(int i=1;i<=n;i++) if(cnt[i]==chu[i]){ for(unsigned int j=0;j
View Code

关于spfa,他死了

都9102年了,还有人卡spfa

只有用堆优化的dijkstra

#include
using namespace std;const int maxn=1000005;#define ll long longint n,m,s,t;vector
>e[maxn],a[maxn];int chu[maxn],cnt[maxn];template
inline void read(T &x){ x=0;char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}}void dfs(int u){ //printf("%d ",u); for(unsigned int i=0;i
,vector < pair < ll,int > >,greater < pair < ll ,int > > > q;bool vis[maxn];ll dis[maxn];void dijkstra(){ for(int i=1;i<=n;i++) dis[i]=0x7fffffff; dis[s]=0; q.push(make_pair(dis[s],s)); while(!q.empty()){ int x=q.top().second; q.pop(); if(vis[x]) continue; vis[x]=true; for(unsigned int i=0;i
dis[x]+e[x][i].second){ dis[y]=dis[x]+e[x][i].second; q.push(make_pair(dis[y],y)); } } }}int main(){ freopen("path.in","r",stdin); freopen("path.out","w",stdout); read(n);read(m); for(int i=1;i<=m;i++){ int x,y; ll z; read(x);read(y);read(z); if(x==y) continue; chu[x]++; a[y].push_back(make_pair(x,z)); } read(s);read(t); cnt[t]=1; dfs(t); //for(int i=1;i<=n;i++) printf("%d %d\n",cnt[i],chu[i]); if(!cnt[s]) {printf("-1");return 0;} cnt[t]=chu[t]; for(int i=1;i<=n;i++) if(cnt[i]==chu[i]){ for(unsigned int j=0;j
View Code

 

转载于:https://www.cnblogs.com/sto324/p/11181659.html

你可能感兴趣的文章
我眼中的技术地图
查看>>
lc 145. Binary Tree Postorder Traversal
查看>>
在centos上开关tomcat
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
查询消除重复行
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Screening technology proved cost effective deal
查看>>
mysql8.0.13下载与安装图文教程
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
【2.2】创建博客文章模型
查看>>
Kotlin动态图
查看>>
从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router
查看>>
Jsp抓取页面内容
查看>>
大三上学期软件工程作业之点餐系统(网页版)的一些心得
查看>>
可选参数的函数还可以这样设计!
查看>>