题目描述 Description

在网络通信中,经常需要求最短路径。但完全用最短路径传输有这样一个问题:如果最终在两个终端节点之间给出的最短路径只有一条。则在该路径中的任一个节点或链路出现故障时,信号传输将面临中断的危险。因此,对网络路由选择作了以下改进:

为任意两节点之间通信提供三条路径供其选择,即最短路径、第二最短路径和第三最短路径。

第一最短路径定义为:给定一个不含负回路的网络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,求给定两点间的第一、第二和第三最短路径。

输入描述 Input Description

输入:  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。

输出描述 Output Description

输出:三条路径(从小到大输出),每条路径占一行,形式为:路径长度 始点…终点  (中间用一个空格分隔)

样例输入 Sample Input

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

样例输出 Sample Output

4  1  2  3  4  5

5  1  3  4  5

6  1  2  3  5

/*
用Dij搞了半天,没搞出来,然而数据太水,DFS可过
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 35
#define M 300100
using namespace std;
int map[N][N],vis[N],b[N],n,s,t,maxn,cnt;
struct node
{
int dis,tot,step[N];
};node a[M];
void init(int p,int dis)
{
a[++cnt].tot=p-;
a[cnt].dis=dis;
for(int i=;i<p;i++)
a[cnt].step[i]=b[i];
}
void dfs(int x,int p,int dis)
{
if(p==&&x==)
int aa=;
if(x==t)
{
init(p,dis);
return;
}
vis[x]=;
for(int i=;i<=n;i++)
if(!vis[i]&&map[x][i])
{
b[p]=i;
vis[i]=;
dfs(i,p+,dis+map[x][i]);
vis[i]=;
}
}
bool cmp(const node&x,const node&y)
{
if(x.dis<y.dis)return true;
return false;
}
int main()
{
scanf("%d%d%d%d",&n,&s,&t,&maxn);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==maxn)map[i][j]=;
}
dfs(s,,);
sort(a,a+cnt+,cmp);
printf("%d %d ",a[].dis,s);
for(int i=;i<=a[].tot;i++)
printf("%d ",a[].step[i]);printf("\n");
printf("%d %d ",a[].dis,s);
for(int i=;i<=a[].tot;i++)
printf("%d ",a[].step[i]);printf("\n");
printf("%d %d ",a[].dis,s);
for(int i=;i<=a[].tot;i++)
printf("%d ",a[].step[i]);printf("\n");
}

路由选择(codevs 1062)的更多相关文章

  1. CODEVS 1062 路由选择

    1062 路由选择  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 在网络通信中,经常需要求最短路径.但完全用最短路径传 ...

  2. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  5. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  6. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  7. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. codevs 1052 地鼠游戏

    1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...

随机推荐

  1. 031_spark架构原理

    spark核心组件 driver master worker executor task(只有task是线程) 核心组件的原理图解

  2. IOS之pageControl

    用户点击页面控件,会触发UIControlEventValueChanged事件,并启动设置为控件动作的任何方法.可以通过调用currentPage查询控件的新值,并通过调整numberOfPages ...

  3. COGS 2274. [HEOI 2016] tree

    ★☆   输入文件:heoi2016_tree.in   输出文件:heoi2016_tree.out   简单对比时间限制:1 s   内存限制:128 MB 这道题数据弱到炸了 . 第一次做用树刨 ...

  4. java异常处理中的细节

    首先看一段代码 public class Test{ public static String output=""; public static void foo(int i){ ...

  5. ubuntu 安装 pcap

    最近在做负载均衡配置,希望将多个dhcp服务配置成一个虚拟dhcp地址,实现dhcp服务高可用.然而配置完成后却发现一个问题,该如何测试呢. 因此就要用上python了,然后ubuntu下面用pip ...

  6. Unity3D windows平台视频录制录屏插件 UnityRecorder

    例子:从官方例子简单改了 using UnityEditor;using UnityEditor.Recorder;using UnityEditor.Recorder.Input;using Sys ...

  7. dropdb - 删除一个现有 PostgreSQL 数据库

    SYNOPSIS dropdb [ option...] dbname DESCRIPTION 描述 dropdb 删除一个现有 PostgreSQL 数据库. 执行这条命令的人必须是数据库超级用户, ...

  8. // mounted: {}, 原来是 空方法 导致了 vue 的警告 !| [Vue warn]: Error in mounted hook: "TypeError: handlers[i].call is not a function"

    // mounted: {}, 原来是 空方法 导致了 vue 的警告 !| vue.runtime.esm.js?2b0e:587 [Vue warn]: Error in mounted hook ...

  9. k8s集群部署之环境介绍与etcd数据库集群部署

    角色 IP 组件 配置 master-1 192.168.10.11 kube-apiserver kube-controller-manager kube-scheduler etcd 2c 2g ...

  10. django 模板中{%for%}的使用

    1.{%for athlete in list reversed%}  reversed用于反向迭代 2.for 标签 支持一个可选的 empty 变量 3.forloop 模板变量 4.forloo ...