圖的遍歷(某谷P3916)
阿新 • • 發佈:2018-11-08
++ algo 枚舉 mem tle std 一個 ret 問題
本來以為很水的題
————
結果第一次TLE了兩個點
(我還是太菜了)
這個題需要你從編號最大的點倒著來枚舉
(太虛假了)
然後就是一個簡單的bfs了(相信對在座的大佬來說完全不算問題)
#include<cstdio> #include<algorithm> #include<vector> #include<queue> #include<cstring> using namespace std; const int maxn=1e5+5; int n,m,u,v; int ans[maxn]; vector<int>g[maxn]; bool vis[maxn]; void bfs(int v){ queue<int>q; //memset(vis,0,sizeof(vis)); q.push(v);vis[v]=1; while(q.size()){ int x=q.front();q.pop(); ans[x]=v; for(int i=0;i<g[x].size();i++){ int u=g[x][i]; if(!vis[u]){ vis[u]=1; q.push(u); } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); g[v].push_back(u); } for(int i=n;i>=1;i--){ if(!vis[i]){ bfs(i); } } for(int i=1;i<=n;i++){ printf("%d ",ans[i]); } return 0; }
圖的遍歷(某谷P3916)