首页 > 代码库 > CSU 1256

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 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 }