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 1
1 2
2 1
2 1
2 0
Sample Output
0
1
-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 else 71 printf("%d\n",-1); 72 } 73 return 0; 74 }