深入虎穴bfs/dfs

保证入口唯一
如何找到入口?没有被标记通往的点就是入口
建立单向图 然后mp标记层次
取队首的同时 判断层次
题目保证最远的那一层点唯一(最远的一层点只有1个)
方法1 bfs

vector<int> g[maxn];
int vis[maxn];
int main()
{
	IO;
	int n,k,t;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>k;
		for(int j=1;j<=k;j++)
		{
			cin>>t;
			g[i].push_back(t);
			
			vis[t]=1;
		}
	}
	int s=0;
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==0)
			s=i;
	} 
	queue<pii> q;
	q.push(mp(s,1));
	int maxlevel=0,maxdata=0;
	while(!q.empty())
	{
		pii p=q.front();
		q.pop();
		int d=p.first;
		int h=p.second;
		if(h>maxlevel)//求最深层 保证结果唯一 
		{
			maxlevel=h;
			maxdata=d; 
		} 
		for(int i=0;i<g[d].size();i++)	//所有通向的点 
		{
			q.push(mp(g[d][i],h+1));
		}
		
	}
	cout<<maxdata<<endl;
	return 0;
} 

方法2 dfs 本质差不多 加一个层次参数
dfs一般用全局变量 什么时候回溯?没有邻接点不走for循环自然回溯

vector<int> g[maxn];
int vis[maxn],maxlevel=0,maxdata=0;
void dfs(int s,int h)
{
	if(h>maxlevel)
	{
		maxlevel=h;
		maxdata=s;
	}
	for(int j=0;j<g[s].size();j++)
	{
		dfs(g[s][j],h+1);
	}
}
int main()
{
	IO;
	int n,k,t;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>k;
		for(int j=1;j<=k;j++)
		{
			cin>>t;
			g[i].push_back(t);
			
			vis[t]=1;
		}
	}
	int s=0;
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==0)
			s=i;
	} 
	dfs(s,1);
	
	cout<<maxdata<<endl;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_40423146/article/details/88932607