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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ2186——并查集+Tarjan算法求强连通分量

發布時間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ2186——并查集+Tarjan算法求强连通分量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法討論:這題陷阱比較多。首先,被所有牛歡迎,這說明所有的牛都要在一個連通圖中,也就是將所給的邊看成無向邊的時候,所有點要在一個連通圖中。這個我們用并查集來實現就可以了。強連通分量的求法就很簡單了,正常的Tarjan就好了。求完強連通分量之后重新建圖,找出新圖上出度為0的點,那么在原圖上在這個強連通分量中的點的個數就是答案。

我的代碼:

program popular;//By_Thispoet constmaxn=10005; vari,j,k,m,n,p,q,total,time,size :longint;pr,la,ot,pre,other,last :array[0..maxn*5]of longint;stack,father :array[0..maxn]of longint;color,dfn,low,num :array[0..maxn]of longint;outo :array[0..maxn]of longint;function min(i,j:longint):longint; beginif i<j then exit(i);exit(j); end;function root(i:longint):longint; beginif father[i]=i then exit(i);father[i]:=root(father[i]);exit(father[i]); end;procedure union(i,j:longint); var x,y:longint; beginx:=root(i);y:=root(j);father[x]:=y; end;procedure deal(i:longint); begininc(total);while stack[size]<>i dobegincolor[stack[size]]:=total;inc(num[total]);dec(size);end;color[i]:=total;inc(num[total]);dec(size); end;procedure tarjan(i:longint); var j,k:longint; begininc(time);dfn[i]:=time;low[i]:=time;inc(size);stack[size]:=i;j:=la[i];while j<>0 dobegink:=ot[j];if dfn[k]<>-1 thenlow[i]:=min(low[i],dfn[k]) elsebegintarjan(k);low[i]:=min(low[i],low[k]);end;j:=pr[j];end;if low[i]=dfn[i] then deal(i); end;procedure prepare; begink:=0;for i:=1 to n do beginj:=la[i];p:=color[i];while j<>0 do beginq:=color[ot[j]];if p<>q then inc(outo[p]);j:=pr[j];end;end; end;beginreadln(n,m);fillchar(num,sizeof(num),0);fillchar(la,sizeof(la),0);for i:=1 to n do father[i]:=i;for i:=1 to m dobeginreadln(p,q);union(p,q);inc(k);pr[k]:=la[p];la[p]:=k;ot[k]:=q;end;for i:=1 to n do if root(i)<>root(1) then beginwriteln(0);halt;end;fillchar(dfn,sizeof(dfn),255);for i:=1 to n doif dfn[i]=-1 then tarjan(i);prepare;p:=0;q:=0;for i:=1 to total do if outo[i]=0 thenbegininc(p);q:=i;end;if p=1 then writeln(num[q]) else writeln(0); end.

轉載于:https://www.cnblogs.com/Thispoet/archive/2011/10/18/2216623.html

總結

以上是生活随笔為你收集整理的POJ2186——并查集+Tarjan算法求强连通分量的全部內容,希望文章能夠幫你解決所遇到的問題。

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