最短路
来源:互联网 发布:php反射机制和依赖注入 编辑:程序博客网 时间:2024/05/06 19:09
1062 路由选择
</pre><div class="well" style="box-sizing: border-box; min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: rgb(237, 241, 242); border: 1px solid rgb(222, 229, 231); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; -webkit-box-shadow: rgba(0, 0, 0, 0.0470588) 0px 1px 1px inset; box-shadow: rgba(0, 0, 0, 0.0470588) 0px 1px 1px inset; color: rgb(88, 102, 110); font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, 微软雅黑, 黑体, sans-serif; font-size: 14px; line-height: 20px;"><pre class="prettyprint" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; padding: 9.5px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857143; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(237, 241, 242); border: 1px solid rgb(222, 229, 231); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px;"><pre name="code" class="cpp">
#include<iostream>#include<vector>#include<queue>#include<list>#include<cmath>#include<climits>#include<cstdio>using namespace std;int n,s,t,maxn,cmin=INT_MAX/100,cmin2=INT_MAX/100,cmin3=INT_MAX/100,num,num2,num3;int c[10000000];int sum=0;int fa[10000000];bool flag[100]={0};int map[100][100];void dfs(int x,int xu,int y){ if(x==t) { if(y<cmin) {cmin3=cmin2; num3=num2; cmin2=cmin; num2=num; cmin=y; num=xu; return; } if(y<cmin2) {cmin3=cmin2; num3=num2; cmin2=y; num2=xu; return; } if(y<cmin3) {cmin3=y; num3=xu; } return; } for(int i=1;i<=n;i++) if(flag[i]==0&&map[x][i]!=maxn) {flag[i]=1; sum++;fa[sum]=xu;c[sum]=i; dfs(i,sum,y+map[x][i]); flag[i]=0; } }int main(){cin>>n>>s>>t>>maxn; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); c[0]=s;flag[s]=1;dfs(s,0,0);vector<int>::reverse_iterator i; vector<int> ans;int u=num; while(u!=0) {ans.push_back(c[u]); u=fa[u]; } ans.push_back(s); cout<<cmin<<' '; for (i = ans.rbegin(); i != ans.rend();++i) cout << *i<<' '; cout<<endl; ans.clear(); u=num2; while(u!=0) {ans.push_back(c[u]); u=fa[u]; } ans.push_back(s); cout<<cmin2<<' '; for (i = ans.rbegin(); i != ans.rend();++i) cout << *i<<' '; cout<<endl; ans.clear(); u=num3; while(u!=0) {ans.push_back(c[u]); u=fa[u]; } ans.push_back(s); cout<<cmin3<<' '; for (i = ans.rbegin(); i != ans.rend();++i) cout << *i<<' '; cout<<endl;return 0;}
在网络通信中,经常需要求最短路径。但完全用最短路径传输有这样一个问题:如果最终在两个终端节点之间给出的最短路径只有一条。则在该路径中的任一个节点或链路出现故障时,信号传输将面临中断的危险。因此,对网络路由选择作了以下改进:
为任意两节点之间通信提供三条路径供其选择,即最短路径、第二最短路径和第三最短路径。
第一最短路径定义为:给定一个不含负回路的网络D={V,A,W},其中V={v1,v2,…,vn},A为边的集合,W为权的集合,设P1是D中最短(v1,vn)路。称P1为D中最短(v1,vn)路径,如果D中有一条(v1,vn)路,P2满足以下条件:
(1)P2≠P1;(2)D中不存在异于P1的路P,使得:
(3)W(P1)≤W(P)<W(P2)
则称P2为D的第二最短路径。
第三最短路径的定义为:设P2是D中第二最短(v1,vn)路径,如果D中有一条(v1,vn)路P3满足以下条件:
(1)P3≠P2并且P3≠P1;(2)D中不存在异于P1,P2的路P,使得:
(3)W(P2)≤W(P)<W(P3)
则称P3为D中第三最短路径。
现给定一有N个节点的网络,N≤30,求给定两点间的第一、第二和第三最短路径。
输入: n S T Max (每格数值之间用空格分隔)
M11 M12 … M1n
M21 M22 … M2n
… …
Mn1 Mn2 … Mnn
其中,n为节点数,S为起点,T为终点,Max为一代表无穷大的整数,Mij描述I到J的距离,若Mij=Max,则表示从I到J无直接通路,Mii=0。
输出:三条路径(从小到大输出),每条路径占一行,形式为:路径长度 始点…终点 (中间用一个空格分隔)
5 1 5 10000
0 1 3 10000 7
10000 0 1 10000 10000
10000 10000 0 1 4
10000 10000 10000 0 1
10000 1 10000 10000 0
4 1 2 3 4 5
5 1 3 4 5
6 1 2 3 5
- 最短路 & 次短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 深入JavaScript(2)揭秘命名函数表达式
- PowerDesigner常用问题总结
- python多线程编程: 使用互斥锁同步线程
- android 拍卖项目
- UI027---UItableview实现QQ好友列表2
- 最短路
- 【Java】Java代码经典错误清单
- const限定符
- 递归删除文件夹及文件
- 九度oj 1011
- 让firefox禁止缓存
- RecyclerView的知识点
- CentOS配置VSFTP服务器
- VBS 自动更新SQL SEVER 2014 Query 模板