a 國需要發展他們的道路建設,他們需要乙個可靠的道路網路,使得任意一條道路癱瘓,整個國家仍然連通。作為 a 國的道路工程師,給你當前 a 國的道路圖,你需要計算至少需要新建設多少條道路才能使得此道路網路是可靠的,並任意給出一種可行方案。約定 a 國有 n 個城市組成,當前有 m 條雙向道路,其中兩個城市之間允許存在多條道路。保證最初的道路網路中,這 n 個城市是相互連通的。
如果要乙個圖沒有橋,那麼只需要讓這個圖上的所有邊都至少屬於乙個環即可。
那麼可以先對原圖中有的環進行縮點,由於圖是聯通的,所有縮點之後圖會變成一棵樹,那麼題目就是讓一棵樹沒有橋。
很顯然的想法是葉子結點兩兩連邊,但這兩個葉子節點之間的路徑一定要經過根節點,所以必須欽定乙個順序來連邊。
首先葉子結點的個數決定了要加多少條邊,記作 \(x\)。為了滿足要求,只需要將第 \(i\) 個和第 \(i+\lfloor \frac\rfloor\) 個葉子結點連起來。如果 \(x\) 是奇數,那麼把隨後乙個葉子節點連向根即可。
當然存在一種情況使得一棵子樹內的葉子結點個數超過了 \(\lfloor\frac\rfloor\),這是因為根沒有選擇正確。如果要保證正確性,要選擇樹的重心作為根。
這題資料較水,可以選擇任意乙個節點作為根就可以 ac。
#include#include#include#define n 1005
using namespace std;
struct node
a[n<<1];
int n,m,tot=1,num,top,cl,ans,mx,mxnum,ans1,ans2,d[n],dfn[n],low[n],sta[n],col[n],head[n],id[n],x[n],y[n],q[n];
bool b[n],map[n][n];
void add(int x,int y)
void dfs(int now,int fa,int lst)
}else low[now]=min(low[now],dfn[v]);
}}void dfs1(int now,int fa)
}int main()
dfs(1,0,-1);
++cl;
for (int i=1;i<=n;++i)
id[++col[i]]=i;
tot=0;memset(head,0,sizeof(head));memset(d,0,sizeof(d));
for (int i=1;i<=m;++i)
if (col[x[i]]!=col[y[i]]) add(col[x[i]],col[y[i]]);
num=0;dfs1(1,0);
for (int i=1;i<=cl;++i)
if (d[i]==1) q[++ans]=i;
printf("%d\n",(ans+1)/2);
for (int i=1;i*2<=ans;++i)
printf("%d %d\n",id[q[i]],id[q[i+ans/2]]);
if (ans%2==1)
printf("%d %d\n",id[q[1]],id[q[ans]]);
return 0;
}
DTOJ 2825 賽車比賽 race
2825 賽車比賽 race 時間限制 2se c2 sec 2sec 記憶體限制 256mb 256 mb 256mbo2o2 o2題目描述 u sb usbus b自己做了一輛卡丁車去參加f1f1 f1賽事,經過了一輪預選賽,還剩下n nn名選手進入決賽。由於各選手的預賽成績不同,所以各選手的出...
hdu2825(狀壓dp AC自動機)
題目 用ac自動機來儲存狀態 用dp來轉移 dp i j k 表示當長度為i時,串末尾為 自動機中 j 節點多對應的值,此時串中選擇狀態為k 的數目 轉移時,下一位狀態,字元長度加一,i 1,即是可以由,j 乙個新的字元,獲得如果這個字元正好是串的最後乙個字元,那麼k的狀態變化為 加上該字元的狀態 ...
HDOJ 2825 AC自動機DP 位運算
題目是要求最少出現k種模式串.開始我看成k個了.囧.k種的話可以用2 k 1的整數可以描述出模式串出現的任意情況.也就是將每個模式串出現否看成二進位制的1,0.題目中模式串最多10個.所以模式串存在狀態最多1023種.先用ac自動機構造trie圖.這個已經很模板很模板了.值得注意的是在構造時給每個點...