1. 程式人生 > 實用技巧 >洛谷P3916題解

洛谷P3916題解

原題:

思路:

emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

這玩意兒不就是一個深搜解決?

一看難度,綠的

行吧看來我把它想簡單了

而且深搜確實有些問題

就題面來看,如果進行深搜,就意味著我們要不斷地訪問同一個點

浪費時間啊

能不能一次求出呢?

思考過後我們發現,顯然,如果一個點能被多個點訪問,那麼這個點也可以通過反向的邊訪問多個點

而如果我們將開始順序由“從小到大”變為“從大到小”

實際上就已經可以用一次遍歷求出多個點的解

程式碼:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int
nxt[100005],last[100005],to[100005],tot,book[100005]; void DFS(int dep,int u) { if(book[dep]) return; book[dep]=u; for(int i=last[dep];i!=0;i=nxt[i]) if(!book[to[i]]) DFS(to[i],u); } void add_edge(int a,int b) { nxt[++tot]=last[b]; last[b]=tot; to[tot]=a; } int main() { scanf(
"%d %d",&n,&m); for(int i=1;i<=m;i++) { int a1,a2; scanf("%d %d",&a1,&a2); add_edge(a1,a2); } for(int i=n;i;i--) DFS(i,i); for(int i=1;i<=n;i++) printf("%d ",book[i]); return 0; }