题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1256

题目大意:

    在另一个平行宇宙中,有一个神奇的国度名叫天朝。天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道。
    不久前天朝大选,小Q当选了天朝的总统。小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从城市1搬迁到城市N去居住。然而小Q惊奇的发现,现在并不存在从城市1出发到城市N路线。
    但这点难题是无法阻挡天朝总统的,小Q决定行使总统的权利下令更改一些道路的通行方向,使得至少存在一条从城市1出发到城市N的路线,但为了节省时间和资源,他希望更改通行方向的道路尽可能少,你能帮帮小Q吗?
 
    输入包含多组测试数据。
    对于每组测试数据,第一行包含两个正整数N (2<=N<=5000)、M (1<=M<=10000),表示天朝一共有N个城市、M条道路。接下来M行每行有两个正整数u、v (1<=u, v<=N),表示城市u和城市v之间有一条通行方向为u->v的单行道。两个城市之间可能有多条道路。
 
    对于每组测试数据,用一行输出一个整数表示最少需要更改多少条单行道的通行方向,才能使得至少存在一条路线能够让小Q从城市1出发到城市N。
    如果没办法使得至少存在一条路线让小Q从城市1出发到城市N,则输出“-1”(不包括引号)。
 
 
思路是:
在给出的路的条件下,都给它添加一条相反方向上的路,令其权值为1,而原方向的权值为0,因为每条路不可能走回头路,所以将两条路都放着,根据所需
取哪条,那么求所需修改的路的方向相当于在求1到N的最短路径,找不到路径说明路怎么修改方向都没用,输出-1
 
这道题不同于前面,我将一条路上的对应的终点,长度以及同一起点对应的下一条路的位置用一个path的结构体保存,这样不会令数组太多而感觉很乱
 
 
代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define N 5005
#define M 20010
#define MAXN 0x3f3f3f3f
int first[N],k,visit[N],dp[N];//对应i城市第一条道路的下标,k表示路的条数 struct Path{
int y,next,d;//y表示终点,next从同一起点出发对应的下一条路的下标,d表示路的长度
}path[M]; void add(int x,int y,int a){
path[k].y=y,path[k].d=a,path[k].next=first[x];
first[x]=k;
k++;
} void spfa(int a){
memset(dp,0x3f,sizeof(dp));
queue<int> q;
dp[a]=,visit[a]=;
q.push(a);
while(!q.empty()){
int b=q.front();
q.pop();
visit[b]=;
for(int i=first[b];i!=-;i=path[i].next){
if(dp[path[i].y]>dp[b]+path[i].d){
dp[path[i].y]=dp[b]+path[i].d;
if(!visit[path[i].y]) visit[path[i].y]=,q.push(path[i].y);
}
}
}
} int main()
{
int n,m,u,v;
while(scanf("%d%d",&n,&m)!=EOF){
memset(first,-,sizeof(first));
k=;
for(int i=;i<m;i++)
{
scanf("%d%d",&u,&v);
add(u,v,);
add(v,u,);
}
spfa();
if(dp[n]<MAXN) cout<<dp[n]<<endl;
else cout<<-<<endl;
}
return ;
}

CSUOJ 1256 天朝的单行道的更多相关文章

  1. CSU1256 天朝的单行道(spfa)

    1256: 天朝的单行道 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 281  Solved: 92 [Submit][Status][pid=12 ...

  2. 天朝使用GAE入门指南

    0. 引言 Across the Great Wall, we can reach every corner in the world. 洒家最近玩了几下 Google App Engine.由于众所 ...

  3. 51Nod 1256 乘法逆元 Label:exgcd

    1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...

  4. csuoj 1511: 残缺的棋盘

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 1511: 残缺的棋盘 时间限制: 1 Sec  内存限制: 128 MB 题目描述 输入 ...

  5. 天朝专用- 配置pypi镜像

    使用python者,需要经常安装模块,可是身在天朝.pypi.python.org 站点稳定性相当差,为了很更好的使用pip安装模块. 请使用镜像. mac/linux 环境 在用户当前目录下 如没有 ...

  6. cdoj 1256 昊昊爱运动 预处理/前缀和

    昊昊爱运动 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1256 Descr ...

  7. csuoj 1354: Distinct Subsequences

    这个题是计算不同子序列的和: spoj上的那个同名的题是计算不同子序列的个数: 其实都差不多: 计算不同子序列的个数使用dp的思想: 从头往后扫一遍 如果当前的元素在以前没有出现过,那么dp[i]=d ...

  8. 中国版 Ubuntu Kylin 14.04 LTS 麒麟操作系统中文版发布下载 (Ubuntu天朝定制版)

    中国版 Ubuntu Kylin 14.04 LTS 麒麟操作系统中文版发布下载 (Ubuntu天朝定制版) http://www.iplaysoft.com/ubuntukylin.html

  9. POJ 1256.Anagram

    2015-06-04 问题简述: 输出一串字符的全排列,顺序不同于一般的字母序,而是 A<a<B<b......<Z<z.所以应该重写一个比较函数. 原题链接:http: ...

随机推荐

  1. ASP.NET MVC Identity 兩個多個連接字符串問題解決一例

    按照ASP.NET MVC Identity建立了一個用戶權限管理模塊,由于還要加自己已有的數據庫,所以建立了一個實體模型,建立了之后,發現登錄不了: 一直顯示“Login in failed for ...

  2. 探究SQL添加非聚集索引,性能提高几十倍之谜

    上周,技术支持反映:客户的一个查询操作需要耗时6.1min左右,在跟进代码后,简化了数据库的查询后仍然收效甚微.后来,技术总监分析了sql后,给其中的一个表添加的一个非聚集索引(三个字段)后,同样的查 ...

  3. 数据库SQL server 删除一张表中的重复记录

    --建立一张表 create table cat( catId int, catName varchar(40) ) --将下边的插入语句,多执行几次. insert into catvalues(1 ...

  4. 程序员必须知道FTP命令

                                             程序员必须知道FTP命令 文件传输软件的使用格式为:FTP<FTP地址>,若连 接成功,系统将提示用户输入 ...

  5. 几个windows使用小技巧

    windows使用技巧 保存网页上图片时,可以按住左键把图片拖到右下角(win+D,双屏幕直接拖动)然后就可以放在桌面啦 放大镜-->Win+加号或者减号(放大或缩小).Win + Esc(退出 ...

  6. 10道有关ios的题

    1.你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗? 2.你实现过多线程的Co ...

  7. vSphere Client用户名密码保存记录

    vSphere Client在访问ESXi主机或vCenter后是默认不保存登录用户名和密码的,不过可以通过修改配置文件来保存,方便访问连接. 方法如下: 打开配置文件路径(实际安装路径):D:\Pr ...

  8. instance of type of object.prototype.tostring 区别

    typeof typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型.   返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 6 种:   number.boolea ...

  9. 浅谈nodejs与npm

    (1)npm介绍 在正式介绍Node.js学习之前,我们先认识一下npm. npm是什么东西?npm其实是Node.js的包管理工具(package manager). 为啥需要一个包管理工具呢?因为 ...

  10. C-基础:函数返回局部变量

    一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了.因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错.但是如果返回的是局部变量的地 ...