時間限制: 1 sec 記憶體限制: 128 mb
煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故
時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出
口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。
請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。
輸入檔案有若干組資料,每組資料的第一行是乙個正整數n(
n≤500
),表示工地的隧道數,接下來的
n 行每行是用空格隔開的兩個整數s 和
t,表示挖
s 與挖煤點
t 由隧道直接連線。輸入資料以
0 結尾。
輸入檔案中有多少組資料,輸出檔案
output.txt
中就有多少行。每行對應一組輸入資料的
結果。其中第
i 行以
case i:
開始(注意大小寫,
case 與i
之間有空格,i 與
:之間無空格,
: 之後有空格),其後是用空格隔開的兩個正整數,第乙個正整數表示對於第
i 組輸入資料至少需
要設定幾個救援出口,第二個正整數表示對於第
i 組輸入資料不同最少救援出口的設定方案總
數。輸入資料保證答案小於
2^64
。輸出格式參照以下輸入輸出樣例。
9 1 3 4 13 51 22 61 56 31 63 26 1 21 32 42 53 63 70
case 1: 2 4case 2: 4 1case 1
的四組解分別是
(2,4),(3,4),(4,5),(4,6);
用到了點雙連通分量,定義是這個連通塊通過割點與其它塊分開,而割點一旦去掉整個塊就不連通了,那麼也就和這道題扯上了關係。對於乙個點雙連通分量,如果他只有乙個割點,那他必須建乙個(在非割點),不然割點塌了這個點雙連通分量就毀了。。如果有兩個以上割點,不用建,因為就算乙個割點塌了,還可以通過另乙個跑掉(狡兔三窟~),也對於沒有割點的(就是自己只連自己)必須建兩個,如果碰巧你建的點塌了,就又毀掉了。。
那麼就很明確了。只是到底有多少種方法求點雙連通分量,我也不知道,但貌似一人一種。。
#include#include#include#include#include#include#define n 500
#define ll long long
using namespace std;
struct node
lu[n*2+5];
int zhan[n*2+5];
int dfn[n*2+5],low[n*2+5],belong[n*2+5];
int n,m,adj[n*2+5],e,cnt,ji,head;
ll ans2=1,ans1=0;
void add(int u,int v)
void init()
void tarjin(int x) }}
void dfs(int x)
t=x;
if(belong[t]>=2)temp++;
++size;
if(!temp)
ans1+=2,ans2*=size*(size-1)/2;
else if(temp==1)
ans1++,ans2*=size-1;
}} }
}int yjn()
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjin(i);
else
belong[i]++;
memset(dfn,0,sizeof(dfn));
ji=0;
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i);
cout<<"case "
int main()
雙連通分量
在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則稱該圖是雙連通的。雙連通無向圖一定是連通的,而連通的無向圖則不一定是雙連通的。對於乙個連通的無向圖也有雙連通分量的概念,定義自然不言而喻。同樣,我們也可以利用tarjan演算法求雙連通分量。define n 10000 struct...
雙連通分量
在乙個無向連通圖中,如果任意去掉乙個定點i及依附於i的所有邊後得到的圖仍然連通,則稱該圖為 2 連通圖 否則,若得到多個連通分量,則該圖不是雙連通的,頂點i被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...
雙連通分量
雙連通分量就是無向圖中的強連通分量,基本就是找割頂和橋。割頂就是乙個點,如果把它取掉,連通分量數量就會增加,橋就是一條邊,同理。對於乙個連通圖,如果任意兩點至少存在兩條 點不重複 的路徑,也就是任意兩條邊都在乙個簡單環中,即內部無割頂,則說這個圖是點雙連通的。對於乙個連通圖,如果任意兩點至少存在兩條...