#include<iostream>#include<algorithm>#include<cstring>usingnamespace std;constint N =100010, M =2* N;int n;int h[N], e[M], ne[M], idx;int vis[N];voidadd(int a,int b)//用单链表存储图{
e[idx]= b;
ne[idx]= h[a];
h[a]= idx ++;}voiddfs(int u)//深搜遍历图{
vis[u]=1;//先开始已经把vis[u] 置成1了 所以后面就不用了for(int i = h[u]; i !=-1; i = ne[i]){int j = e[i];if(!vis[j])dfs(j);}}intmain(){memset(h,-1,sizeof h);//将每一个点的单链表的表尾置为-1dfs(1);return0;}
2. 例题:树的重心
#include<iostream>#include<algorithm>#include<cstring>usingnamespace std;constint N =100010, M =2* N;int h[N], e[M], ne[M], idx;//idx存的是边bool vis[N];int ans = N;int n;voidadd(int a,int b)//新增a走到b{
e[idx]= b;
ne[idx]= h[a];
h[a]= idx ++;}//返回u这个结点子树的个数intdfs(int u)//dfs到u这一个点了 深度优先遍历可以求出每个点的子树的个数{
vis[u]=1;int sum =1, res =0;for(int i = h[u]; i !=-1; i = ne[i]){int j = e[i];if(!vis[j]){int s =dfs(j);
res =max(res, s);//左子树和右子树的个数的最大值
sum += s;//u的所有子树的和}}
res =max(res, n - sum);
ans =min(ans, res);return sum;}intmain(){
cin >> n;memset(h,-1,sizeof h);for(int i =0; i < n -1; i ++){int a, b;scanf("%d%d",&a,&b);add(a, b);add(b, a);}dfs(1);
cout << ans << endl;return0;}
3.图中点的层次–最短路径 (bfs)
#include<iostream>#include<algorithm>#include<cstring>usingnamespace std;constint N =100010;int n, m;int h[N], e[N], ne[N], idx;int d[N], q[N];voidadd(int a,int b){
e[idx]= b;
ne[idx]= h[a];
h[a]= idx ++;}intbfs(){int hh =0, tt =0;memset(d,-1,sizeof d);
d[1]=0;
q[0]=1;while(hh <= tt){int t = q[hh ++];for(int i = h[t]; i !=-1; i = ne[i]){int j = e[i];if(d[j]==-1){
d[j]= d[t]+1;
q[++ tt]= j;}}}return d[n];}intmain(){
cin >> n >> m;memset(h,-1,sizeof h);for(int i =0; i < m; i ++){int a, b;scanf("%d%d",&a,&b);add(a, b);}
cout <<bfs()<< endl;return0;}
4.有向图的拓扑序列(bfs)
#include<iostream>#include<algorithm>#include<cstring>usingnamespace std;constint N =100010;int h[N], e[N], ne[N], idx;int q[N], d[N];//d[i] 表示结点i的入度int n, m;voidadd(int a,int b){
e[idx]= b;
ne[idx]= h[a];
h[a]= idx ++;}booltopsort(){int hh =0, tt =-1;//首先让入度为0的结点入队for(int i =1; i <= n; i ++){if(!d[i]){
q[++ tt]= i;}}while(hh <= tt){int t = q[hh ++];for(int i = h[t]; i !=-1; i = ne[i]){int j = e[i];
d[j]--;if(!d[j]) q[++ tt]= j;}}return tt == n -1;}intmain(){
cin >> n >> m;memset(h,-1,sizeof h);for(int i =0; i < m; i ++){int a, b;scanf("%d%d",&a,&b);add(a, b);
d[b]++;}if(topsort()){for(int i =0; i < n; i ++){
cout << q[i]<<" ";}
cout << endl;}else{
cout <<"-1"<< endl;}return0;}