Reachability from the Capital

题目描述

There are nn cities and mm roads in Berland. Each road connects a pair of cities. The roads in Berland are one-way.

What is the minimum number of new roads that need to be built to make all the cities reachable from the capital?

New roads will also be one-way.

Input

The first line of input consists of three integers nn, mm and ss (1n5000,0m5000,1sn1≤n≤5000,0≤m≤5000,1≤s≤n) — the number of cities, the number of roads and the index of the capital. Cities are indexed from 11 to nn.

The following mm lines contain roads: road ii is given as a pair of cities uiui, vivi (1ui,vin1≤ui,vi≤n, uiviui≠vi). For each pair of cities (u,v)(u,v), there can be at most one road from uu to vv. Roads in opposite directions between a pair of cities are allowed (i.e. from uu to vv and from vv to uu).

Output

Print one integer — the minimum number of extra roads needed to make all the cities reachable from city ss. If all the cities are already reachable from ss, print 0.

Examples

Input

9 9 1
1 2
1 3
2 3
1 5
5 6
6 1
1 8
9 8
7 1

Output

3

Input

5 4 5
1 2
2 3
3 4
4 1

Output

1
 

The first example is illustrated by the following:

For example, you can add roads (6,46,4), (7,97,9), (1,71,7) to make all the cities reachable from s=1s=1.

The second example is illustrated by the following:

In this example, you can add any one of the roads (5,15,1), (5,25,2), (5,35,3), (5,45,4) to make all the cities reachable from s=5s=5.

 

题解: 

强连通缩点后统计入度为0的个数ans,然后看首都的入度是否为0;如果是则ans-1;

 1 #include<cstdio>
 2 #include <algorithm>
 3 #include <stack>
 4 #include <vector>
 5 #include <cstring>
 6 using namespace std;
 7 
 8 const int MAXN=1e5+10;
 9 const int inf=0x3f3f3f3f;
10 struct node{
11     int to;
12     int next;
13 }edge[MAXN*4];
14 int head[MAXN];
15 int val[MAXN];
16 bool instack[MAXN];
17 int cnt;
18 int dfn[MAXN],low[MAXN];
19 int sum[MAXN];
20 void add(int x,int y)
21 {
22     edge[++cnt].to =y;
23     edge[cnt].next=head[x];
24     head[x]=cnt;
25 }
26 int Time,num;
27 stack<int >st;
28 int du[MAXN];
29 int color[MAXN];
30 int x[MAXN],y[MAXN];
31 void tarjan(int u)
32 {
33     dfn[u]=low[u]= ++Time;
34     st.push(u);
35     instack[u]=true;
36     for (int i = head[u]; i !=-1 ; i=edge[i].next) {
37         int v=edge[i].to;
38         if(!dfn[v]){
39             tarjan(v);
40             low[u]=min(low[u],low[v]);
41         }
42         else if(instack[v]) low[u]=min(low[u],dfn[v]);
43     }
44     if(dfn[u]==low[u])
45     {
46         int x;
47         num++;
48         while(1) {
49             x=st.top();
50             st.pop();
51             color[x]=num;
52             instack[x]=false;
53             if(x==u) break;
54         }
55 
56     }
57 }
58 
59 int main()
60 {
61     int n,m,s;
62     scanf("%d%d%d",&n,&m,&s);
63     cnt=0;
64     memset(head,-1,sizeof(head));
65     memset(instack,false, sizeof(instack));
66     memset(sum, 0,sizeof(sum));
67     for (int i = 1; i <=m ; ++i) {
68         scanf("%d%d",&x[i],&y[i]);
69         add(x[i],y[i]);
70     }
71     for (int i = 1; i <=n ; ++i) {
72         if(!dfn[i]) tarjan(i);
73     }
74     for (int i = 1; i <=m ; ++i) {
75         if(color[x[i]]!=color[y[i]])
76         {
77             du[color[y[i]]]++;
78         }
79     }
80 
81     int ans=0;
82     for (int i = 1; i <=num ; ++i) {
83         if(du[i]==0) ans++;
84     }
85     if(du[color[s]]==0) ans--;
86     printf("%d\n",ans);
87     return 0;
88 }
View Code

 

 

  

 
 

转载于:https://www.cnblogs.com/-xiangyang/p/9341449.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值