博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UESTC 914 方老师的分身I Dijkstra
阅读量:4701 次
发布时间:2019-06-09

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

题意:求有向图的往返最短路的最长长度。

分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来。考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果。

所以此题为求两次最短路。

代码:

#include 
#include
#include
#include
#include
#define Mod 1000000007using namespace std;#define N 1007int mp[N][N],n,m;int dis[N],vis[N],dis2[N];void Dijastra(int s,int *dis){ int now = s; int i,k; dis[now] = 0; vis[now] = 1; for(i=1;i<=n;i++) { for(k=1;k<=n;k++) //order 1 { if(mp[now][k] != Mod && dis[now] + mp[now][k] < dis[k]) dis[k] = dis[now] + mp[now][k]; } int mini = Mod; //order 2 for(k=1;k<=n;k++) { if(dis[k] < mini && !vis[k]) { now = k; mini = dis[k]; } } vis[now] = 1; }}int main(){ int u,v,w,i,j,x; while(scanf("%d%d%d",&n,&m,&x)!=EOF) { for(i=1;i<=n;i++) dis[i] = Mod; dis[x] = 0; for(i=1;i<=n;i++) { for(j=i;j<=n;j++) mp[i][j] = mp[j][i] = Mod; mp[i][i] = 0; } while(m--) { scanf("%d%d%d",&u,&v,&w); mp[u][v] = w; } memset(vis,0,sizeof(vis)); Dijastra(x,dis); for(i=1;i<=n;i++) dis2[i] = Mod; dis2[x] = 0; for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { swap(mp[i][j],mp[j][i]); } } memset(vis,0,sizeof(vis)); Dijastra(x,dis2); int maxi = -1; for(i=1;i<=n;i++) { if(dis[i] < Mod && dis2[i] < Mod) maxi = max(maxi,dis[i]+dis2[i]); } printf("%d\n",maxi); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/whatbeg/p/3765417.html

你可能感兴趣的文章
gridview 自定义value值
查看>>
2018二月实现计划成果及其三月规划
查看>>
类名.class和getClass()区别
查看>>
12/17面试题
查看>>
LeetCode 242. Valid Anagram
查看>>
JSP表单提交乱码
查看>>
如何适应现代雇佣关系
查看>>
团队项目(第五周)
查看>>
SQL 优化经验总结34条
查看>>
开源 视频会议 收藏
查看>>
核心J2EE模式 - 截取过滤器
查看>>
.net开源CMS
查看>>
JdbcTemplate
查看>>
第一次使用maven记录
查看>>
SharePoint服务器端对象模型 之 使用CAML进展数据查询
查看>>
Building Tablet PC Applications ROB JARRETT
查看>>
Adobe® Reader®.插件开发
查看>>
【POJ 3461】Oulipo
查看>>
Alpha 冲刺 (5/10)
查看>>
使用Siege进行WEB压力测试
查看>>