1.P5318 【深基18.例3】查找文献 普及-
#include <bits/stdc++.h>
using namespace std;
struct edge{
int b,e;
};
vector <int> l[1000001];//点所连的边 x表起始点 l[x][y]表
vector <edge> k;//边
int n,m,u,v;
int v1[100001],v2[100001],num[100001];
queue <int> s;//点 队列
bool cmp(edge x,edge y){
if (x.b==y.b) return x.e<y.e;
else return x.b<y.b;
}
void dfs(int x){
v1[x]=1;
printf("%d ",x);
for (int i=0;i<l[x].size();i++){
if(!v1[k[l[x][i]].e]) {
dfs(k[l[x][i]].e);
}
}
}
void bfs(int x){
v2[x]=1;
s.push(x);
printf("%d ",x);
while(!s.empty()){
int xx=s.front();
v2[xx]=1;
for (int i=0;i<l[xx].size();i++){
int point=k[l[xx][i]].e;
if(!v2[point]){
printf("%d ",point);
s.push(point);
v2[point]=1;
}
}
s.pop();
}
}
int main(){
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++){
cin>>u>>v;
k.push_back((edge){u,v});
}
sort(k.begin(),k.end(),cmp);
for (int i=0;i<m;i++){
l[k[i].b].push_back(i);
}
dfs(1);
printf("\n");
bfs(1);
return 0;
}
3997

被折叠的 条评论
为什么被折叠?



