站外题求调!玄关!!!(bfs)
  • 板块灌水区
  • 楼主ST_jz_xpj
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/16 19:10
  • 上次更新2024/10/16 21:22:05
查看原帖
站外题求调!玄关!!!(bfs)
1378388
ST_jz_xpj楼主2024/10/16 19:10

题目大意: 有n个点,n-1条边的无向图;每个点存着一个字符; 给你这个图,求从1号节点出发的线路,使得这条路线的字典序最大

目前怀疑是bfs的过程出了问题

我的代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int n,m,a,b,d,num,fa[1000050];char p[1000050];
queue <int> li;
stack <char> ans;
struct k{
	int de;int fa;char p;bool v=0;
	vector <int> q;
}po[1000050];
void prt(int now){
	ans.push(po[now].p);
	if(now!=1)prt(po[now].fa);
}
void bfs(int now){
	if(!po[now].v){
		po[now].v=1;
		char t=po[po[now].q[0]].p;int ti=0;
		for(int i=0;i<(int)po[now].q.size();i++){
			if(po[now].fa!=po[now].q[i])po[po[now].q[i]].fa=now;
			if(po[po[now].q[i]].p>t&&!po[po[now].q[ti]].v){
				t=po[po[now].q[i]].p;ti=i;
			}
		}
		for(;ti<(int)po[now].q.size();ti++){
			if(po[po[now].q[ti]].p==t&&!po[po[now].q[ti]].v){
				li.push(po[now].q[ti]);
			}
		}
	}
	
	if((int)li.size()>1)li.pop();
	if((int)li.size()==1){
		if((int)po[now].q.size()==1) prt(now);
		else bfs(li.front());
	}
	bfs(li.front());
}
int main(){
	//freopen("road.in","r",stdin);
	//freopen("road.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>po[i].p;
	for(int i=1;i<n;i++){
		cin>>a>>b;
		po[a].q.push_back(b);po[b].q.push_back(a);
	}
	bfs(1);
	//for(int i=1;i<=n;i++)cout<<po[i].fa<<" ";
	//cout<<ans.size()<<" ";
	while(!ans.empty()){  
    	cout<<ans.top();ans.pop();
	}
	//fclose(stdin);fclose(stdout);
	return 0;
}

感激不尽!!!

2024/10/16 19:10
加载中...