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 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
随机推荐
- Mysql 储存过程以及 python callproc调用
一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...
- Java开发环境安装
一.安装JDK(java development kit) 下载地址:www.oracle.com/technetwork/java/javase/downloads 二.配置Java环境变量 1.J ...
- jQuery工作原理解析以及源代码示例
jQuery的开篇声明里有一段非常重要的话:jQuery是为了改变javascript的编码方式而设计的.从这段话可以看出jQuery本身并不是UI组件库或其他的一般AJAX类库.jQuery改变ja ...
- LBS配置
js: <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...
- ./configure 时候报错c++ 编译器不能执行
./configure时报错:configure: error: C++ compiler cannot create executables .哎,今天重装测试服务器上的系统,设置好IP可以远程访问 ...
- C语言初学 求100到200的全部素数
#include<stdio.h> #include<math.h> int main() { int m,i,k; for(m=101;m<=200;m=m+2) { ...
- C51的模块化设计方法
一个大的单片机程序往往包含很多模块,我是这样组织的: 1.每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有. ...
- 自制单片机之一------AT89S51最小系统制做
C51最小系统电路在网上一搜一大把,大同小异.我略做改动后如图: 加一个11.0592MHZ的晶振是为了以后做串口通信时和PC有相同的波特率.可用短路帽切换.说说板子的布局:网上卖的最小系统都是把板子 ...
- Cmake Error: your compiler "cl" was not Found .etc
又是环境变量路径等问题,烦死人了. TIPS:请注意,控制台的窗口也有自己的环境变量,从系统环境变量和用户环境变量继承过来的,一个窗口(控制台)可以添加属于自己的环境变量(跟别的控制台窗口没关系) 解 ...
- sql模糊匹配
执行 数据库查询时,有完整查询和模糊查询之分. 一般模糊语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,%:表示任意0个 ...