Skip to content

Commit 45c4664

Browse files
committed
边建图+dfs+bfs搜索,bfs搜索过程前排序
1 parent 4398340 commit 45c4664

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

luogu/P5318.cpp

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include<iostream>
2+
#include<algorithm>
3+
#include<queue>
4+
using namespace std;
5+
const int maxE = 1e6+5; // max edge num
6+
const int maxN = 1e5+5;
7+
typedef struct{
8+
int next,to;
9+
}Edge;
10+
queue<int> que;
11+
int head[maxN];//head[i] 表示第i个节点的第一条边
12+
int eN = 0;
13+
Edge edge[maxE];//存放每条边的信息
14+
Edge temp_Edge[maxE]; // 为啥这个要放在外面申请才可以?
15+
bool vis[maxN]; //访问信息
16+
int temp[maxN]; //存放临时节点
17+
//将结构体按照规则排序 => 用于保证在dfs的时候可以从小到大
18+
int cmp(Edge e1,Edge e2){
19+
if (e1.next == e2.next){
20+
return e1.to > e2.to;
21+
}
22+
else
23+
return e1.next < e2.next;
24+
}
25+
26+
27+
//将a,b 两个节点放到的其中 => 建图
28+
void add(int a,int b){
29+
edge[eN].next = head[a];
30+
edge[eN].to = b;
31+
head[a] = eN;
32+
eN++;
33+
}
34+
35+
36+
void dfs(int cur){
37+
// vis[cur] = true;
38+
cout << cur<<" ";
39+
for(int i = head[cur];i!=-1;i=edge[i].next){
40+
int eTo = edge[i].to; //得到这个到达点的信息
41+
if(!vis[eTo]){//未访问过
42+
vis[eTo] = true;
43+
dfs(eTo);
44+
}
45+
}
46+
}
47+
48+
49+
void bfs(int root){
50+
que.push(root);//将根放到其中
51+
vis[root] = true; //注意这里需要设置一下
52+
while(!que.empty()){
53+
int cnt = 0;
54+
for(int i = head[root];i!=-1;i=edge[i].next){
55+
int eTo = edge[i].to; //得到这个到达点的信息
56+
if (!vis[eTo]) {
57+
vis[eTo] = true;
58+
temp[cnt] = eTo;
59+
cnt ++;
60+
}
61+
}
62+
sort(temp,temp+cnt);
63+
for (int i = 0;i< cnt ;i++){
64+
que.push(temp[i]);
65+
}
66+
root = que.front();
67+
que.pop();
68+
cout << root <<" ";
69+
}
70+
}
71+
72+
int main(){
73+
int n,m;
74+
cin >>n >> m;
75+
int a ,b;
76+
fill(head,head+maxN,-1);
77+
fill(vis,vis+maxN,false);
78+
79+
for (int i = 0;i < m;i++){
80+
cin >> a >> b;
81+
temp_Edge[i].next = a;
82+
temp_Edge[i].to = b;
83+
}
84+
85+
//将结构体按照规则排序
86+
sort(temp_Edge,temp_Edge+m,cmp);
87+
for (int i = 0;i< m;i++){
88+
a = temp_Edge[i].next;
89+
b = temp_Edge[i].to;
90+
//cout << a <<" " << b <<"\n";
91+
add(a,b);
92+
}
93+
94+
//1为根
95+
vis[1] = true;
96+
dfs(1);
97+
fill(vis,vis+maxN,false);
98+
cout <<"\n";
99+
bfs(1);
100+
}
101+

0 commit comments

Comments
 (0)