codeforce 999E(连通图问题)

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

猜你喜欢

转载自blog.csdn.net/yezi_coder/article/details/104687499
今日推荐