在另一个平行宇宙中,有一个神奇的国度名叫天朝。天朝一共有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 #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 }