dfs bfs双90求调
查看原帖
dfs bfs双90求调
758345
lzy20100716楼主2025/1/25 09:38
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100005;
vector<int> G[MAXN]; //邻接表存储的图 
queue<int> q;
bool flag[MAXN];//标记数组 ,flag【i】 =flase表示没去过 
int bfs(int i)//用bfs的方法找到i顶点出发能到达的最大顶点编号 
{
	int ans=0;//最大顶点编号 
	// 初始状态入队
	q.push(i);
	flag[i]=true;
	//队列非空时,重复执行
	while (!q.empty())
	{
		//2-1 队头元素出队
		int u=q.front();
		q.pop();
		ans=max(ans,u);//PK
		//扩展新状态
		for (int j=0;j<G[u].size();j++)
		{
			int v=G[u][j];
			if(!flag[v])
			{
				q.push(v);
				flag[v]=true;
			}
		 } 
		//入队 
	}
	
	return ans; 
}
int a[MAXN];
int main()
{
	int n,m;
	cin>>n>>m;
	for (int i=0;i<m;i++)
	{
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
	}
	for (int i=1;i<=n;i++)
	{
		memset(flag,0,sizeof(flag));
		a[i]=bfs(i);
	}
	for (int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
 } 
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100005;
vector<int> G[MAXN]; //邻接表存储的图 
queue<int> q;
bool flag[MAXN];//标记数组 ,flag【i】 =flase表示没去过 
int ans=0;
void dfs(int i)//用dfs的方法找到i顶点出发能到达的最大顶点编号 
{
	if (flag[i]==true)
	{
		return;
	}
	flag[i]=true;
	ans=max(i,ans);
	for (int j=0;j<G[i].size();j++)
	{
		dfs(G[i][j]);
	}
	
}
int a[MAXN];
int main()
{
	int n,m;
	cin>>n>>m;
	for (int i=0;i<m;i++)
	{
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
	}
	for (int i=1;i<=n;i++)
	{
		memset(flag,0,sizeof(flag));
		ans=0;
		dfs(i);
		a[i]=ans;
	}
	for (int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
 } 
2025/1/25 09:38
加载中...