3916 图的遍历
这似乎是一个板子
注意一下,这个边是指有向边,我一开始的时候推错了
所以这个题,如果用暴力的话时间是O(NM),应该可以得个60分
这个题需要一种逆向思维,其实正确得做法是什么tarjan或者缩点
但是
我太菜了
我真得不会
我只好用反向建边
反向建边,就是这个题让我们求最大得点,但我偏偏从最大得点开始走,开开最远能走到哪里
(应该是这么一回事)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#define SIZE 100010
using namespace std;
int n,m;
int a[SIZE];
vector<int> e[SIZE];
int book[SIZE];
void dfs(int x,int find)
{
if(book[x]) return ;
book[x]=find;
for(int i=0;i<e[x].size();i++)
{
dfs(e[x][i],find);
}
}
int main()
{
int u,v;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
e[v].push_back(u);//反向造图
}
for(int i=n;i;i--)//反向搜索
{
dfs(i,i);
}
for(int i=1;i<=n;i++) cout<<book[i]<<" ";
return 0;
}