思路:多少頭牛收到所有牛頭牛的喜歡,喜歡具有傳遞性,所以將互相喜歡的牛視為乙個點,就是有向圖的
縮點,收到所有牛的喜歡要求這個「點」沒有出度,所以縮點之後統計所有沒有出度的點就是結果,如果有多頭牛沒有出度,
就說明圖不連通,答案為0。
#include#includeview code#include
using
namespace
std;
const
int maxn = 500500
;int
num[maxn],low[maxn],vis[maxn],head[maxn],ver[maxn],next[maxn],tot;
int st[maxn],out
[maxn],fa[maxn],top,tim,col;
int min(int x,int
y)int max(int x,inty)
void
init()
void addedge(int u,int
v)void tarjan(int u) //
強連通模板
else
if(!fa[v]) low[u]=min(low[u],num[v]);
}if(low[u]==num[u])
top--;
}}int main(void
)
for(i=1;i<=n;i++)
if(!vis[i]) tarjan(i);
for(i=1;i<=n;i++)
}x=0
;
int cnt=0,sum=0
;
for(i=1;i<=col;i++)
if(out[i]==0) cnt++,x=i;
if(cnt==1)
else printf("
0\n"
); }
return0;
}
強連通分量 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 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...