vijos1769網路的關鍵邊 Tarjan求橋

2021-07-29 21:30:47 字數 2070 閱讀 3355

description

考慮乙個連通的無向圖,可以知道,任意兩個節點都可以通過一條路徑連線起來。在所有節點中,某些節點向所有與它連通的節點提供a服務(包括向它自己),同時某些節點向所有與它連通的節點提供b服務(也包括向它自己)。注意乙個節點也可能同時提供a、b兩種服務。

當圖中的某條邊e被去掉的時候,如果圖中有任何乙個點無法接受a服務或者接受b服務,我們稱e邊為關鍵邊。

那麼,你需要做的事情就是:

1、輸出圖中存在多少關鍵邊;

2、從小到大輸出所有這樣的關鍵邊的編號。

input

輸入檔案共m+3行。第1行輸入4個整數n,m,k和l。n表示圖中的節點個數,m是圖中邊的數目,k是提供a服務的點的個數,l是提供b服務的點的個數。第2行輸入k個數,分別表示哪些點提供a服務。第3行輸入l個數,分別表示哪些點提供b服務。接下來m行每行輸入兩個數p,q表示節點p和節點q之間有一條無向邊。節點從1至n編號,邊按從讀入順序從1至m編號。

output

輸出檔案第1行輸出乙個數s,表示該網路中存在s條關鍵邊,接下來輸出s行,每行輸出一條關鍵邊編號。請按編號從小到大(讀入順序編號)輸出。

sample input

9 10 3 4

2 4 5

4 9 8 3

1 24 1

2 34 2

1 55 6

6 76 8

7 98

sample output
336

9

hint

每個測試點2s。

對於15%的資料,n<=30,m<=30,k<=5,l<=5;

對於35%的資料,n<=400,m<=400,k<=30,l<=30;

對於50%的資料,n<=3000,m<=3500,k<=100,k<=100。

對於100%的資料,n<=100000,m<=100000,k<=10000,l<=10000。

保證沒有重邊和自環。

題解求割邊就算當一條邊滿足起點的dfn小於終點的low。

並且乙個割邊將圖分成搜尋樹中其連線的子和其上面的一塊。我們可以記錄兩個陣列a[i],b[i]來記錄搜尋樹中以i為節點,這顆子樹的a,b服務有多少個。

當乙個邊的終點的a或b為0,代表其子樹是通過其上面的點得到a,b服務,去掉邊就無法獲得。

或者是乙個邊的終點的a或b為k或l。代表如果沒有這條邊,起點就沒有服務。

這樣就可以記錄答案。

#include 

#include

#include

#include

#include

#include

#include

#define maxn 200000+10

#define maxm 200000+10

using

namespace

std;

int head[maxn],num,n,m,l,k;

int dfn[maxn],low[maxn],vis[maxn],dfnum,root,son;

int ans[maxm],cnt[maxm],a[maxn],b[maxn];

stack

st;

struct edgeedge[maxm*2];

void add(int from,int to)

void tarjan(int x,int fa)

ta+=a[edge[i].to];

tb+=b[edge[i].to];

}}else

if(vis[edge[i].to])

low[x]=min(low[x],dfn[edge[i].to]);

}}int main()

for(int i=1;i<=n;i++)

if(!dfn[i]) tarjan(i,i);

sort(ans+1,ans+ans[0]+1);

printf("%d\n",ans[0]);

for(int i=1;i<=ans[0];i++)

return

0;}

POJ 3204 網路流的必須邊

思路 求一遍網路流 在殘餘網路上dfs 從起點dfs 從終點把邊反向dfs 乙個邊跟起點連通 跟終點反向的邊連通 ans 注 此題不能用tarjan 因為有邊權為0的邊 by siriusren include include include include using namespace std ...

UVA11248 網路擴容(列舉割邊擴充)

題意 給你乙個有向圖,問你從1到n的最大流是多少?如果流量大於等於c那麼直接輸出乙個串,否則輸出只擴充一條邊的流量就可以達到1 n大於等於c的所有邊,如果擴充不了就 輸出另乙個串。sample input 4 4 5 1 2 5 1 3 5 2 4 5 3 4 5 4 4 5 1 2 1 1 3 5...

hdu 4280 網路流 sap 點邊資料很大

匆匆過客 題意 有n個島嶼 m條無向路 每個路有一最大允許的客流量,求從最西的那個島嶼最多能運用多少乘客到最東的那個島嶼。思路 很單純的網路流,重點是卡時間 模板的高效性很重要啊該模板詳解 參見這裡 模板題就不注釋了 include include define vm 100010 define e...