Reachability from the Capital
题意:
给n,m,s
n代表一共有多少个点,m代表已经有了多少条路径下面会给出,s是起始点
(u,v)对应有一条u到v的路径(单向的)
问从起始点要到每一个点的话,最少还需要添加几条路径
思路:
首先遍历每一个点遍历过的点vis标记一下,存入栈中,起点最后存入,先存入每一条路的终点,为了后面的再次访问方便
然后清空vis
用s去dfs,把s能到的点vis标为1,然后对栈的每一个元素dfs,遍历的都标为1,每次开始dfs,ans++。即既在栈中,vis又为0的就是起始点到不了的点,再找一共需要增加多少条路径。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10007;
int n, m, s;
int ans;
int vis[maxn];
vector<int> mp[maxn];
stack<int> st;
void dfs(int x)
{
vis[x] = 1;
for(int i = 0; i < mp[x].size(); i++)
{
int t = mp[x][i];
if(!vis[t])
dfs(t);
}
st.push(x);
}
void dfs_again(int x)
{
vis[x] = 1;
for(int i = 0; i < mp[x].size(); i++)
{
int t = mp[x][i];
if(!vis[t])
dfs_again(t);
}
}
int main()
{
cin >> n >> m >> s;
int a, b;
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&a,&b);
mp[a].push_back(b);
}
for(int i = 1; i <= n; i++)
{
if(!vis[i])
dfs(i);
}
memset(vis,0,sizeof(vis));
dfs_again(s);
while(!st.empty())
{
int t = st.top();
if(!vis[t])
{
dfs_again(t);
ans++;
}
st.pop();
}
cout << ans;
return 0;
}