n頭牛,現在給出m組關係(a,b)表示a喜歡b,喜歡具有傳遞性,問有多少頭牛是被所有牛喜歡。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=10005;
const
int maxm=50005;
int n,m;
bool used[maxn];
int belong[maxn];//所屬強連通分量的拓撲序,belong[i]表示i屬於哪個分支
int out[maxn];
struct edge
edge[maxm*2];
int edgecount;
int head[maxn];
int rhead[maxn];
void init()
void add_edge1(int u,int v)
void add_edge2(int u,int v)
stack
q;void dfs(int u)
q.push(u);
}void rdfs(int u,int group)
}int scc()//返回強連通分量個數
memset(used,0,sizeof(used));
while(!q.empty())
}return ans;
}int main()
int scc_cnt=scc();
for(int u=1;u<=n;u++)
}int sum=0;//統計出度為0的點的塊數
int x;//出度為0的連通分量編號
for(int i=1;i<=scc_cnt;i++)
}int ans=0;
for(int i=1;i<=n;i++)
if(sum==1)cout
cout
<<0
0;}
強連通分量(模板)
low u min edge maxm 2 int head maxm 2 tot int low maxn dfn maxn belong maxn belong 的值為1 scc int index,top int scc 強連通分量 bool instack maxn int num maxn...
強連通分量模板
知識背景 首先明確強連通分量 strongly connected component 的概念,從任一頂點能夠到達任一其他頂點的有向圖 的頂點子集,而任意有向圖均可以分解成若干不相交的scc。把每個scc視作乙個頂點,可得到乙個dag。實現演算法 兩次dfs,第一次 dfs 遍歷將頂點後序 post...
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...