洛谷P3916題解
阿新 • • 發佈:2020-10-25
原題:
思路:
emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
這玩意兒不就是一個深搜解決?
一看難度,綠的
行吧看來我把它想簡單了
而且深搜確實有些問題
就題面來看,如果進行深搜,就意味著我們要不斷地訪問同一個點
浪費時間啊
能不能一次求出呢?
思考過後我們發現,顯然,如果一個點能被多個點訪問,那麼這個點也可以通過反向的邊訪問多個點
而如果我們將開始順序由“從小到大”變為“從大到小”
實際上就已經可以用一次遍歷求出多個點的解
程式碼:
#include<bits/stdc++.h> using namespace std; int n,m; intnxt[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; }