P5318 【深基18.例3】查找文献
思路:dfs和bfs,注意已经遍历到的要进行标记,因为图中存在环
vector的排序:sort(g.begin(),g.end());
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 100005;
vector<int> g[maxn];
int n,m;
bool vis[maxn],vis2[maxn];
void dfs(int k){
for(int i=0;i<g[k].size();i++){
if(!vis[g[k][i]])
{
cout<<g[k][i]<<" ";
vis[g[k][i]]=1;
dfs(g[k][i]);
}
}
}
queue<int> q;
void bfs(){
q.push(1);
vis2[1]=1;
int d;
while(!q.empty()){
d=q.front();
q.pop();cout<<d<<" ";
for(int i=0;i<g[d].size();i++){
if(!vis2[g[d][i]]){
vis2[g[d][i]]=1;
q.push(g[d][i]);
}
}
}
}
int main(){
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
g[u].push_back(v);
}
for(int i=1;i<=n;i++)sort(g[i].begin(),g[i].end());
vis[1]=1;
cout<<"1 ";
dfs(1);
cout<<endl;
bfs();
return 0;
}
思路:很巧妙,反向建图,然后n从大到小反向dfs遍历图,每次遍历的位置都是最大值。
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
int n,m;
const int maxn = 100005;
vector<int> g[maxn];
int f[maxn];
bool vis[maxn];
void dfs(int k,int d){
if(f[k])return;
f[k]=d;
for(int i=0;i<g[k].size();i++)
dfs(g[k][i],d);
}
int main()
{
cin>>n>>m;
int u,v,d;
for(int i=1;i<=m;i++){
cin>>u>>v;
g[v].push_back(u);
}
for(int i=n;i;i--)dfs(i,i);
for(int i=1;i<=n;i++)cout<<f[i]<<" ";
return 0;
}