CODEVS 1062 路由选择
1062 路由选择
在网络通信中,经常需要求最短路径。但完全用最短路径传输有这样一个问题:如果最终在两个终端节点之间给出的最短路径只有一条。则在该路径中的任一个节点或链路出现故障时,信号传输将面临中断的危险。因此,对网络路由选择作了以下改进:
为任意两节点之间通信提供三条路径供其选择,即最短路径、第二最短路径和第三最短路径。
第一最短路径定义为:给定一个不含负回路的网络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
/*次短路求解 dijkstra算法*/
#include<cstdio>
#define N 50
const int inf=;
int n;
int d[N][N],dist[][N],vis[][N],step[][N][N];
void dijkstra(int S){
int i,j,tm,u,v,k,l;
for(i=;i<=n;i++)
for(j=;j<;j++)
dist[j][i]=inf;
for(i=;i<=n;i++)
if(i!=S&&d[S][i]<inf) dist[][i]=d[S][i],step[][i][++step[][i][]]=S;
dist[][S]=;
step[][S][]=;
vis[][S]=;
for(i=;i<n*;i++){
for(j=,tm=inf,u=v=;j<=n;j++)
for(k=;k<;k++)
if(!vis[k][j]&&tm>dist[k][j]){tm=dist[k][j];u=k;v=j;}
vis[u][v]=;
for(j=;j<=n;j++)
if(v!=j){
k=dist[u][v]+d[v][j];
if(!vis[][j]&&k<=dist[][j]){
dist[][j]=dist[][j];
step[][j][]=step[][j][];
for(l=;l<=step[][j][];l++) step[][j][l]=step[][j][l];
dist[][j]=dist[][j];
step[][j][]=step[][j][];
for(l=;l<=step[][j][];l++) step[][j][l]=step[][j][l];
dist[][j]=k;
for(l=;l<=step[u][v][];l++) step[][j][l]=step[u][v][l];
step[][j][++step[][j][]]=v;
}else if(!vis[][j]&&k<dist[][j]){
dist[][j]=dist[][j];
step[][j][]=step[][j][];
for(l=;l<=step[][j][];l++) step[][j][l]=step[][j][l];
dist[][j]=k;
for(l=;l<=step[u][v][];l++) step[][j][l]=step[u][v][l];
step[][j][++step[][j][]]=v;
}else if(!vis[][j]&&k<dist[][j]){
dist[][j]=k;
for(l=;l<=step[u][v][];l++) step[][j][l]=step[u][v][l];
step[][j][++step[][j][]]=v;
}
}
}
}
int main(){
int S,T,ig,i,j;
scanf("%d%d%d%d",&n,&S,&T,&ig);
for(i=;i<=n;i++){
for(j=;j<=n;j++){
scanf("%d",&d[i][j]);
if(d[i][j]==ig) d[i][j]=inf;
}
}
dijkstra(S);
printf("%d ",dist[][T]);
for(i=;i<=step[][T][];i++) printf("%d ",step[][T][i]);printf("%d\n",T);
printf("%d ",dist[][T]);
for(i=;i<=step[][T][];i++) printf("%d ",step[][T][i]);printf("%d\n",T);
printf("%d ",dist[][T]);
for(i=;i<=step[][T][];i++) printf("%d ",step[][T][i]);printf("%d\n",T);
return ;
}
CODEVS 1062 路由选择的更多相关文章
- 路由选择(codevs 1062)
题目描述 Description 在网络通信中,经常需要求最短路径.但完全用最短路径传输有这样一个问题:如果最终在两个终端节点之间给出的最短路径只有一条.则在该路径中的任一个节点或链路出现故障时,信号 ...
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
随机推荐
- jQuery插件autoComplete使用
安装/需要引入的文件 <script type="text/javascript" src="../js/jquery-1.8.3.min.js.js"& ...
- mysql日志文件相关的配置【1】
1.log_output=[file | table | none ] 这个参数指定general_log &slow_query_log 的输出目标.可以是table | file | no ...
- 初探 iOS8 中的 Size Class
初探 iOS8 中的 Size Class 分类: Ios2014-09-16 13:11 4323人阅读 评论(1) 收藏 举报 目录(?)[+] 初探 iOS8 中的 Size Class ...
- Swift 可选链-备
在Swift程序表达式中会看到问号(?)和感叹号(!),它们代表什么含义呢?这些符号都与可选类型和可选链相关,下面来看看可选链. 可选链: 类图: 它们之间是典型的关联关系类图.这些类一般都是实体类, ...
- 阅读记录:Learning multiple layers of representation(杂乱笔记)
典型的浅层学习结构: 传统隐马尔可夫模型(HMM).条件随机场 (CRFs).最大熵模型(Maxent).支持向量机(SVM).核回归及仅含单隐层的多层感知器(MLP)等. 局部表示,分布式表示和稀疏 ...
- ural 1586. Threeprime Numbers
这道题看着别人的代码写的. #include <cstdio> #include <cstring> #define m 1000000009 using namespace ...
- C51 Keil 优化
对程序进行优化,通常是指优化程序代码或程序执行速度.优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难 ...
- mysql sql优化<1>
<pre name="code" class="html">explain SELECT t.* FROM ( SELECT t1.sn AS cl ...
- 在Visual Studio 2013中编译libssh2项目
一. 下载需要的外部包,并解压,下面给出的链接如果无法访问,就google搜索下载一下: •下载openssl •下载zlib 二.修改libssh2项目配置: 1.C/C++->Gene ...
- cf492D Vanya and Computer Game
D. Vanya and Computer Game time limit per test 2 seconds memory limit per test 256 megabytes input s ...