题目链接: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. 真tm无聊,这几天。。。

    临近期末了,每天都要和学霸一起上自习. 很不喜欢学习和自己未来没多大用的东西 老师画的那些重点是对我们好吗~ 每天感觉都在折磨自己,不想学,学不进去,心里很烦躁,浮躁. 人生苦短->_-> ...

  2. rhel6.5--http练习

    包名 简介 httpd-2.2.15-29.el6_4.x86_64.rpm         http服务的主程序包 httpd-devel-2.2.15-29.el6_4.x86_64.rpm ap ...

  3. 【前端】jQurey Plugin

    ; (function ($, window, document, undefined) { "use strict"; var defaults = { name: " ...

  4. Log4net系列二:Log4net邮件日志以及授权码

    Log4net邮件发送 上篇文章我们主要介绍Log4net生成文本格式,本篇文章主要配置邮箱发送.关于项目的引用,搭建我们就不在描述,如果不太清楚,请看上篇文章, 老规矩,我们现在配置文件中添加一个a ...

  5. img 标签访问图片返回403forbidden

    做百度编辑器时,从秀米复制过来的文档,图片不无法加载,返回403的错 解决办法 解决这个问题只需要在头部添加一个meta <meta name="referrer" cont ...

  6. P3368 【模板】树状数组 2 单点查询与区间修改

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  7. 响应式布局 max-device-width 与 max-width 的区别

    闲来没事,研究了一下多屏适配和响应式布局的 CSS. 第一种写法 @media screen and (max-device-width: 320px) { } @media screen and ( ...

  8. mac自带终端安装完ohmyZsh后显示乱码

    修改描述文件-添加 选择新导入的 Meslo LG M Regular for Powerline

  9. 项目中常用git命令操作指令(一般正常的话够用不够再看相关git命令)

    配置git1.首先在本地创建ssh key:ssh-keygen -t rsa -C "github上注册的邮箱" //(一路回车)2.进入c:/Users/xxxx_000/.s ...

  10. Comparator.comparing比较排序

    使用外部比较器Comparator进行排序 当我们需要对集合的元素进行排序的时候,可以使用java.util.Comparator 创建一个比较器来进行排序.Comparator接口同样也是一个函数式 ...