首页 > 代码库 > CSU 1256
CSU 1256
1256: 天朝的单行道
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 159 Solved: 46
[Submit][Status][Web Board]
Description
在另一个平行宇宙中,有一个神奇的国度名叫天朝。天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道。
不久前天朝大选,小Q当选了天朝的总统。小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从城市1搬迁到城市N去居住。然而小Q惊奇的发现,现在并不存在从城市1出发到城市N路线。
但这点难题是无法阻挡天朝总统的,小Q决定行使总统的权利下令更改一些道路的通行方向,使得至少存在一条从城市1出发到城市N的路线,但为了节省时间和资源,他希望更改通行方向的道路尽可能少,你能帮帮小Q吗?
Input
输入包含多组测试数据。
对于每组测试数据,第一行包含两个正整数N (2<=N<=5000)、M (1<=M<=10000),表示天朝一共有N个城市、M条道路。接下来M行每行有两个正整数u、v (1<=u, v<=N),表示城市u和城市v之间有一条通行方向为u->v的单行道。两个城市之间可能有多条道路。
Output
对于每组测试数据,用一行输出一个整数表示最少需要更改多少条单行道的通行方向,才能使得至少存在一条路线能够让小Q从城市1出发到城市N。
如果没办法使得至少存在一条路线让小Q从城市1出发到城市N,则输出“-1”(不包括引号)。
Sample Input
2 11 22 12 12 0
Sample Output
01-1
HINT
很简单的最小路问题
只不过把权值分别设为0,1
一定要记得初始化
1 #include <stdio.h> 2 #include <queue> 3 using namespace std; 4 const int maxm = 20010;//两倍!!!! 5 const int maxn = 5010; 6 const int maxd = 9999; 7 int v[maxm],w[maxm],next[maxm]; 8 int first[maxn],d[maxn],inq[maxn],e; 9 10 void init()11 {12 for(int i =0;i<maxn;i++)13 first[i] = -1;14 e = 0;15 }16 17 void addeage(int x,int y,int z)18 {19 v[e]=y;20 w[e]=z;21 next[e]=first[x];22 first[x]=e;23 e++;24 }25 26 void spfa(int s)27 {28 queue<int> q;29 for(int i =0;i<maxn;i++)30 d[i]=maxd;31 d[s] = 0;32 inq[s] = 1;33 q.push(s);34 35 while(!q.empty())36 {37 int u = q.front();38 q.pop();39 inq[u]=0;40 for(int i =first[u];i!=-1;i=next[i])41 {42 if(d[v[i]]>d[u]+w[i])43 {44 d[v[i]]=d[u]+w[i];45 if(inq[v[i]]==0)46 {47 q.push(v[i]);48 inq[v[i]]=1;49 }50 }51 }52 }53 }54 55 int main()56 {57 int n,m,a,b;58 while(scanf("%d%d",&n,&m)!=EOF)59 {60 init();61 for(int i = 0;i<m;i++)62 {63 scanf("%d%d",&a,&b);64 addeage(a,b,0);65 addeage(b,a,1);66 }67 spfa(1);68 if(d[n]!=maxd)69 printf("%d\n",d[n]);70 else71 printf("%d\n",-1);72 }73 return 0;74 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。