22. [HAOI2005] 路由选择问题

★★★   输入文件:route.in   输出文件:route.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】

X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径。遗憾的是,由于种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点。
任务一:在己知故障节点的情况下,求避开这些故障节点,从节点I到节点J的最短路径S0。
任务二:在不考虑故障节点的情况下,求从节点I到节点J的最短路径S1、第二最短路径S2。

【输入文件】

第1行: N I J (节点个数 起始节点 目标节点)
第2—N+1行: Sk1 Sk2…SkN (节点K到节点J的距离为SkJ K=1,2,……,N)
最后一行: P T1 T2……Tp (故障节点的个数及编号)

【输出文件】

S0 S1 S2 (S1<=S2 从节点I到节点J至少有两条不同路径)

【输入输出样例】

route.in

5 1 5
0 10 5 0 0
10 0 0 6 20
5 0 0 30 35
0 6 30 0 6
0 20 35 6 0
1 2

route.out

40 22 30

【约束条件】

(1)N<=50 N个节点的编号为1,2,…,N
(2)Skj为整数,Skj<=100,(K,J=1,2…,N 若Skj=0表示节点K到节点J没线路)
(3)P<=5  

思路:先跑一个最短路再跑一个次短路,然后把有故障的点和与之相连的边删去,最后再跑一个最短路。

错因:题目中的路径为简单路,然而,我并没有考虑这一点。

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1000
#define INF 0x3f3f3f3f
using namespace std;
struct nond{
int g,f,to,vis[MAXN];
bool operator<(const nond &r) const {
if(r.f==f) return r.g<g;
else return r.f<f;
}
}tmp,opt;
int n,s,t,p,cnt,tot,tot1,ans1,ans2,ans3;
int dis[MAXN],vis[MAXN],map[MAXN][MAXN];
int to[MAXN],head[MAXN],net[MAXN],cap[MAXN];
int to1[MAXN],head1[MAXN],net1[MAXN],cap1[MAXN];
void add(int u,int v,int w){
to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot;
to1[++tot1]=u;net1[tot1]=head1[v];cap1[tot1]=w;head1[v]=tot1;
}
void spfa(int s){
queue<int>que1;
for(int i=;i<=n;i++) dis[i]=INF;
que1.push(s);
vis[s]=;dis[s]=;
while(!que1.empty()){
int now=que1.front();
que1.pop();
vis[now]=;
for(int i=head1[now];i;i=net1[i])
if(dis[to1[i]]>dis[now]+cap1[i]){
dis[to1[i]]=dis[now]+cap1[i];
if(!vis[to1[i]]){
vis[to1[i]]=;
que1.push(to1[i]);
}
}
}
}
int Astar(int kk){
priority_queue<nond>que;
if(s==t) kk++;
if(dis[s]==INF) return -;
tmp.g=;
tmp.to=s;
tmp.f=dis[s];
que.push(tmp);
while(!que.empty()){
tmp=que.top();
que.pop();
if(tmp.to==t) cnt++;
if(cnt==kk) return tmp.g;
for(int i=head[tmp.to];i;i=net[i]){
if(tmp.vis[to[i]]) continue;
opt=tmp;
opt.to=to[i];
opt.g=tmp.g+cap[i];
opt.f=opt.g+dis[to[i]];
opt.vis[to[i]]=;
que.push(opt);
}
}
return -;
}
int main(){
freopen("route.in","r",stdin);
freopen("route.out","w",stdout);
scanf("%d%d%d",&n,&s,&t);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int x;
scanf("%d",&x);
map[i][j]=x;
if(x!=) add(i,j,x);
}
spfa(t);
ans1=dis[s];
for(int i=;i<=n;i++){
cnt=;
int bns=Astar(i);
if(bns!=dis[s]){
ans2=bns;
break;
}
}
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
memset(to1,,sizeof(to1));
memset(cap1,,sizeof(cap1));
memset(net1,,sizeof(net1));
memset(head1,,sizeof(head1));
tot1=;
scanf("%d",&p);
for(int i=;i<=p;i++){
int x;
scanf("%d",&x);
for(int j=;j<=n;j++)
map[x][j]=map[j][x]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(map[i][j]) add(i,j,map[i][j]);
spfa(t);
ans3=dis[s];
printf("%d %d %d",ans3,ans1,ans2);
}

cogs 22. [HAOI2005] 路由选择问题的更多相关文章

  1. cogs——21. [HAOI2005] 希望小学

    21. [HAOI2005] 希望小学 ★★   输入文件:hopeschool.in   输出文件:hopeschool.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述 ...

  2. TCP/IP协议原理与应用笔记22:静态和动态路由选择

    1. 静态路由选择: Static routing 管理员手工设置 管理员手动更新 不能保证路由的一致性和及时性 管理性强 没有路由开销 小型.变化缓慢网络 2. 动态路由选择 Dynamic rou ...

  3. COGS——T 21. [HAOI2005] 希望小学

    http://www.cogs.pro/cogs/problem/problem.php?pid=21 ★★   输入文件:hopeschool.in   输出文件:hopeschool.out    ...

  4. 【RL-TCPnet网络教程】第22章 RL-TCPnet之网络协议IP

    第22章      RL-TCPnet之网络协议IP 本章节为大家讲解IP(Internet Protocol,网络协议),通过前面章节对TCP和UDP的学习,需要大家对IP也有个基础的认识. (本章 ...

  5. COGS——T 438. 烦人的幻灯片

    http://www.cogs.pro/cogs/problem/problem.php?pid=438 ★☆   输入文件:slides.in   输出文件:slides.out   简单对比时间限 ...

  6. RabbitMQ入门教程(六):路由选择Routing

    原文:RabbitMQ入门教程(六):路由选择Routing 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  7. 《OSPF和IS-IS详解》一1.5 ARPANET内的路由选择

    本节书摘来异步社区<OSPF和IS-IS详解>一书中的第1章,第1.5节,作者: [美]Jeff Doyle 译者: 孙余强 责编: 傅道坤,更多章节内容可以访问云栖社区"异步社 ...

  8. CENTOS 6.5 平台离线编译安装 Mysql5.6.22

    一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...

  9. EC笔记:第4部分:22、所有成员都应该是private的

    EC笔记:第4部分:22.所有成员都应该是private的 更简单的访问 用户不用记得什么时候该带上括号,什么时候不用带上括号(因为很确定的就要带上括号) 访问限制 对于public的成员变量,我们可 ...

随机推荐

  1. EF--ModelFirst

    EF框架有三种基本的方式:DB First,Model First,Code First.这里简单的说一下Model First,适合没有基础的同学照着做,学习基础的东西. 1.建立一个类库项目,这个 ...

  2. Android内存管理(11)*常见JVM回收机制「Java进程内存堆分代,JVM分代回收内存,三种垃圾回收器」

    参考: http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 1,Java进程内存堆分代: 典型的JVM根据generation(代 ...

  3. c/c++ 参数传递 - 数组

    对于函数参数中的数组类型:传递的是数组地址,可以理解成传递的是对数组的引用.不是值传递,这是由C/C++函数实现机制决定的.一下三种函数生命完全等价: void func(int array[10]) ...

  4. MVC系列学习(十七)-过滤器

    本次学习的文件结构如下 1.过滤器的几种表示方式 1.1将过滤器 加到方法上,作用范围为该方法 1.2将过滤器加到当前类上,作用范围为该类的所有方法 1.3添加全局过滤器,作用范围为所有方法 2.Ac ...

  5. [Codeforces]Codeforces Round #489 (Div. 2)

    Nastya and an Array 输出有几种不同的数字 #pragma comment(linker, "/STACK:102400000,102400000") #ifnd ...

  6. servlet-请求重定向

    package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...

  7. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

  8. 【Android】进程间通信IPC——Binder

    Binder是Android中的跨进程通信方式,bindService的时候,服务端返回Binder对象,通过该对象客户端可以从服务端获取数据.在进程间通信IPC——AIDL中创建了ICustomAi ...

  9. IO文件读取

    /** *按字节读取文件 */@Testpublic void readerByte() { File file = new File("D:\\BindCheckControllerTes ...

  10. java中关于数组的初始化