日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ2186-Popular Cows(流行的奶牛)【tarjan,强连通分量,图论】

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,强连通分量,图论】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。