CSU 1256

1256: 天朝的单行道

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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 }

 

posted @ 2014-07-29 14:52  Run_dream  阅读(191)  评论(0编辑  收藏  举报