题目链接
https://pintia.cn/problem-sets/994805046380707840/problems/1386335159927652361
解题思路
1.DFS深搜
- 比赛的时候忘了怎么在广搜中标记路径,就用了深搜;
- 结果wa了一个点、还有一个点内存超限,怎么都改不过来~
- 赛后找出了问题:
DFS(int s,vector<int>temp)
这样用temp数组做参数,由于递归的次数很多,每次都会创建一个,就容易导致内存超限
1.应该用temp的长度sum做参数
2.也可以用DFS(int s,vector<int>&temp),这样保证始终只构造temp
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
/*
*/
vector<int>G[10005];
int lev[10005];
vector<int>ans,temp;
void DFS(int s,int sum){
if(sum>ans.size())
ans=temp;
else if(ans.size()==sum&&ans>temp){
ans=temp;
}
for(int i=0;i<G[s].size();i++){
int f=G[s][i];
temp.push_back(f);
DFS(f,sum+1);
temp.pop_back();
}
}
int main(){
int n,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
while(x--){
cin>>y;
G[i].push_back(y);
lev[y]++;
}
}
int s=0;
for(int i=0;i<n;i++)
if(!lev[i]){
s=i;
break;
}
ans.push_back(s);
temp=ans;
DFS(s,1);
cout<<ans.size()<<endl;
int l=ans.size();
for(int i=0;i<l;i++){
if(i!=0)cout<<" ";
cout<<ans[i];
}
return 0;
}
2.广搜
- 用pair<int,string>表示从起点s到达i的路径string;
- 然后跟广搜时一样判断就行;
代码展示
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
/*
1.用set去重排序
2.优先队列常用用
3.链式向前星
*/
vector<int>G[maxn];
int lev[maxn];
bool vis[maxn];
int dis[maxn];
int main(){
int n,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
while(x--){
cin>>y;
G[i].push_back(y);
lev[y]++;
}
}
queue<pair<int,string> >q;
for(int i=0;i<n;i++)
if(!lev[i]){
char c=i+'0';
string temp=temp+c;
q.push(make_pair(i,temp));
vis[i]=1;
}
int maxnum=0;string ans;
ans="";
while(!q.empty()){
pair<int,string> temp=q.front();
string s2=temp.second;
q.pop();
if(ans.size()<s2.size())
ans=temp.second;
else if(ans.size()==s2.size()&&ans>s2)
ans=s2;
for(int i=0;i<G[temp.first].size();i++){
int f=G[temp.first][i];
if(!vis[f]){
vis[f]=1;
q.push(make_pair(f,temp.second+char(f+'0')));
}
}
}
int l=ans.size();
cout<<ans<<endl;
cout<<l<<endl;
for(int i=1;i<ans.size();i++)
cout<<ans[i];
return 0;
}
有一个问题:
判断ans的长度后输出总是有乱码,但是注释掉ans.size(),输出就不会有乱码,求大佬解释。