博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Reachability from the Capital
阅读量:4943 次
发布时间:2019-06-11

本文共 3196 字,大约阅读时间需要 10 分钟。

题目描述

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
2 #include
3 #include
4 #include
5 #include
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
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

你可能感兴趣的文章
项目练习计划
查看>>
Xshell远程登录
查看>>
@RequestParam与@PathVariable的区别
查看>>
C语言之break和continue
查看>>
jquery.form.js使用
查看>>
LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”。
查看>>
回顾2012,展望2013
查看>>
Spring中的ApplicationContextAware使用
查看>>
HDU-2067-小兔的棋盘
查看>>
监听手机录音
查看>>
hadoop的WordCount样例
查看>>
客户化程序完成标准成本成批更新
查看>>
JZOJ 1286. 太空电梯
查看>>
大数据平台组件布置 与 进程查看
查看>>
Hadoop3集群搭建之——hive添加自定义函数UDTF (一行输入,多行输出)
查看>>
【转】去除inline-block元素的间隙
查看>>
JS - Math对象
查看>>
MUI开发指南(二) webview对象
查看>>
HTML5按键打开摄像头和拍照
查看>>
基本sql语句--触发器
查看>>