POJ2186-Popular Cows(流行的奶牛)【tarjan,强连通分量,图论】
生活随笔
收集整理的這篇文章主要介紹了
POJ2186-Popular Cows(流行的奶牛)【tarjan,强连通分量,图论】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接
大意
有n頭奶牛,奶牛們會認為有些奶牛很受歡迎,受歡迎會互相傳遞,如:如果A認為B很受歡迎,而B認為C受歡迎,那么A也會認為C是受歡迎的。然后求每一個奶牛都認為受歡迎的奶牛數量。
解題思路
先用tarjan算法算一遍聯通分量,然后如果該聯通分量出度為0且是唯一一個為0的,那么這個強聯通分量里就是受每個奶牛歡迎的。
講解一下原理:
首先我們假設這道題有解,那么我們將每一個強聯通分量看做一個整體,然后如果該整體有出度那么說明這不是最受歡迎的(因為如果受到出度鏈接的那個整體歡迎的話那么就應該是一個聯通分量里的)。如果有兩個出度為0那么這兩個整體就不會互相喜歡,就無解。
代碼
#include<cstdio> #include<stack> using namespace std; stack<int> Stack; struct line{int h,t,next; }; int n,m,dfn[10001],low[10001],stn,ls[10001],ltn,lt[10001]; int ltm[10001],wr[10001],s1,ans; bool instack[10001]; line a[50001]; void tarjan(int x) {dfn[x]=low[x]=++stn;instack[x]=true;Stack.push(x);//入棧int y;for (int q=ls[x];q;q=a[q].next)//枚舉連接到{y=a[q].t;if (!dfn[y])//如果沒用計算{tarjan(y);//計算low[x]=min(low[x],low[y]);//更新low值}else if (instack[y] && low[x]>dfn[y])low[x]=dfn[y];}if (dfn[x]==low[x]){ltn++;while (Stack.size()>0){y=Stack.top();Stack.pop();ltm[ltn]++;lt[y]=ltn;if (y==x) break;}//歸入同一個強連通分量} } int main() {scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){scanf("%d%d",&a[i].h,&a[i].t);a[i].next=ls[a[i].h];ls[a[i].h]=i;}for (int i=1;i<=n;i++)if (dfn[i]==0) tarjan(i);//跑一遍for (int i=1;i<=m;i++)if (lt[a[i].t]!=lt[a[i].h]){wr[lt[a[i].h]]++;}//計算每個強連通的出度for (int i=1;i<=ltn;i++)if (!wr[i]){ans=i;s1++;//計算出度為0的數量}if (s1==1) printf("%d",ltm[ans]);else printf("0"); }總結
以上是生活随笔為你收集整理的POJ2186-Popular Cows(流行的奶牛)【tarjan,强连通分量,图论】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vivo X100 系列手机上架京东,1
- 下一篇: P1197-星球大战【并查集,图论】