#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
vector<int> arr[100001];
//arr[a][b]=c
//a的第b条边是 a指向c
bool isvisited[100001];
struct edge{
int s;
int e;
};
vector<edge> E;
struct cmp{
//果真是这里出现了问题
bool operator()(const edge & s1,const edge & s2)const{
if(s1.s==s2.s) return s1.e<s1.e;
else return s1.s<s2.s;
}
};
void dfs(int s);
void bfs(int s);
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int temp1,temp2;
cin>>temp1>>temp2;
E.push_back(edge{temp1,temp2});
}
sort(E.begin(),E.end(),cmp());
//cout<<E[0].s<<' '<<E[0].e<<endl;
for(int i=0;i<m;i++){
arr[E[i].s].push_back(E[i].e);
}
dfs(1);
cout<<endl;
memset(isvisited,0,sizeof(isvisited));
bfs(1);
cout<<endl;
return 0;
}
void dfs(int s){
if(isvisited[s]) return ;
isvisited[s]=1;
cout<<s<<' ';
int len=arr[s].size();
for(int i=0;i<len;i++){
dfs(arr[s][i]);
}
}
void bfs(int s){
queue<int> que;
isvisited[s]=1;
que.push(s);
while(!que.empty()){
int top=que.front();
cout<<top<<' ';
que.pop();
int len=arr[top].size();
for(int i=0;i<len;i++){
if(!isvisited[arr[top][i]]){
isvisited[arr[top][i]]=1;
que.push(arr[top][i]);
}
}
}
}
我觉得在排序结构体cmp里 只要保证每一个起点的对应终点有序就行了,即按照上述代码,一开始我的想法是错误的,起点有序,可为什么不对呢? 我已经知道正确做法 即 终点排序
bool operator()(const edge & s1,const edge & s2)const{
if(s1.e==s2.e) return s1.s<s1.s;
else return s1.e<s2.e;
}