【NOIP2015】【Luogu2661】信息传递(有向图最小环)
生活随笔
收集整理的這篇文章主要介紹了
【NOIP2015】【Luogu2661】信息传递(有向图最小环)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
problem
- 給定一張n個點,n條邊的有向圖
- 求圖的最小環,輸出大小
solution
kosaraju暴力求出所有強連通分量,取最小值即可。
codes
//kosaraju #include<iostream> #include<algorithm> #include<vector> #define maxn 200010 using namespace std; vector<int>G[maxn], rG[maxn]; vector<int>vs, cmp[maxn]; int vis[maxn], book[maxn], cnt; void dfs(int u){if(vis[u])return ;vis[u] = 1;for(int i = 0; i < G[u].size(); i++)dfs(G[u][i]);//for(int i = 0; i < G[u].size(); i++)if(!vis[G[u][i]])dfs(G[u][i]);vs.push_back(u); } void rdfs(int u){//if(book[u])return ;book[u] = cnt;cmp[cnt].push_back(u);for(int i = 0; i < rG[u].size(); i++)if(!book[rG[u][i]])rdfs(rG[u][i]);//for(int i = 0; i < rG[u].size(); i++)rdfs(rG[u][i]); } int main(){int n; cin>>n;for(int i = 1; i <= n; i++){int x; cin>>x;G[i].push_back(x);rG[x].push_back(i);}for(int i = 1; i <= n; i++)dfs(i);for(int i = n-1; i >= 0; i--){if(!book[vs[i]]){++cnt;rdfs(vs[i]);}}int ans = 0xffffff;for(int i = 1; i <= cnt; i++){int si = cmp[i].size();if(si != 0 && si != 1){ans = min(ans, si);}}cout<<ans<<"\n";return 0; }轉載于:https://www.cnblogs.com/gwj1314/p/10200102.html
總結
以上是生活随笔為你收集整理的【NOIP2015】【Luogu2661】信息传递(有向图最小环)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CF526F】Pudding Mons
- 下一篇: 电路仿真软件