z國坐落於遙遠而又神奇的東方半島上,在小z的統治時代公路成為這裡主要的交通手段。z國共有n座城市,一
些城市之間由雙向的公路所連線。非常神奇的是z國的每個城市所處的經度都不相同,並且最多隻和乙個位於它東
邊的城市直接通過公路相連。z國的首都是z國政治經濟文化旅遊的中心,每天都有成千上萬的人從z國的其他城市
湧向首都。為了使z國的交通更加便利順暢,小z決定在z國的公路系統中確定若干條規劃路線,將其中的公路全部
改建為鐵路。我們定義每條規劃路線為乙個長度大於1的城市序列,每個城市在該序列中最多出現一次,序列中相
鄰的城市之間由公路直接相連(待改建為鐵路)。並且,每個城市最多只能出現在一條規劃路線中,也就是說,任意
兩條規劃路線不能有公共部分。當然在一般情況下是不可能將所有的公路修建為鐵路的,因此從有些城市出發去往
首都依然需要通過乘坐長途汽車,而長途汽車只往返於公路連線的相鄰的城市之間,因此從某個城市出發可能需要
不斷地換乘長途汽車和火車才能到達首都。我們定義乙個城市的「不便利值」為從它出發到首都需要乘坐的長途汽
車的次數,而z國的交通系統的「不便利值」為所有城市的不便利值的最大值,很明顯首都的「不便利值」為0。小
z想知道如何確定規劃路線修建鐵路使得z國的交通系統的「不便利值」最小,以及有多少種不同的規劃路線的選擇
方案使得「不便利值」達到最小。當然方案總數可能非常大,小z只關心這個天文數字modq後的值。注意:規劃路
線1-2-3和規劃路線3-2-1是等價的,即將一條規劃路線翻轉依然認為是等價的。兩個方案不同當且僅當其中乙個方
案中存在一條規劃路線不屬於另乙個方案。
第一行包含三個正整數n、m、q,其中n表示城市個數,m表示公路總數,n個城市從1~n編號,其中編號為1的是首都
。q表示上文提到的設計路線的方法總數的模數。接下來m行,每行兩個不同的正數ai、bi(1≤ai,bi≤n)表示有一條
公路連線城市ai和城市bi。輸入資料保證一條公路只出現一次。
包含兩行。第一行為乙個整數,表示最小的「不便利值」。第二行為乙個整數,表示使「不便利值」達到最小時
不同的設計路線的方法總數modq的值。如果某個城市無法到達首都,則輸出兩行-1。
5 4 100
1 24 5
1 34 1110
以下樣例中是10種設計路線的方法:
(1)4-5
(2)1-4-5
(3)4-5,1-2
(4)4-5,1-3
(5)4-5,2-1-3
(6)2-1-4-5
(7)3-1-4-5
(8)1-4
(9)2-1-4
(10)3-1-4
【資料規模和約定】
對於100%的資料,滿足1≤n,m≤100000,1≤q≤120000000。
根據題意乙個點最多只能向右連一條邊,那麼這一定是一棵樹。。。
所以顯然如果邊數小於n-1,那麼無解。。。
然後我們考慮一下答案。。。顯然答案最大不超過這棵樹的層數。。。
再看一下點數,發現是100000,所以樹最多是21層。。。
所以答案應該不超過21.。。
然後我們再來考慮方案數。。。可以得到乙個點最多連兩條優化的邊。。。
所以很容易想到這是乙個dp。。。
f[i][j][k]表示i與i的子樹間連k條邊,答案是j的方案數。。
所以易得:
f[i][j][0]=∏(f[x][j-1][0]+f[x][j-1][1]+f[x][j-1][2]) x是i的兒子節點
f[i][j][1]=∑((f[x][j][1]+f[x][j][0])*∏(f[y][j-1][0]+f[y][j-1][1]+f[y][j-1][2])) y是不同於x的i的兒子結點
f[i][j][2]=∑((f[x][j][1]+f[x][j][0])*(f[y][j][1]+f[y][j][0])*∏(f[z][j-1][0]+f[z][j-1][1]+f[z][j-1][2]))
整理後令
tmp1=f[x][j][1]+f[x][j][0]
tmp2=f[x][j-1][0]+f[x][j-1][1]+f[x][j-1][2]
則f[i][j][2]=f[i][j][2]*tmp2+f[i][j][1]*tmp1
f[i][j][1]=f[i][j][1]*tmp2+f[i][j][0]*tmp1
f[i][j][0]=f[i][j][0]*tmp2;
然後就好了。。。
1 #include2 #include3 #include4 #include5 #include6 #include7 #includeview code8 #include9 #include10 #include11 #include
12#define inf 1000000000
13#define maxn 100000+5
14#define maxm 200000+5
15#define eps 1e-10
16#define ll long long
17#define for0(i,n) for(int i=0;i<=(n);i++)
18#define for1(i,n) for(int i=1;i<=(n);i++)
19#define for2(i,x,y) for(int i=(x);i<=(y);i++)
20#define for3(i,x,y) for(int i=(x);i>=(y);i--)
21#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22using
namespace
std;
23ll read()
26while(ch>='
0'&&ch<='9')
27return x*f;28}
29int
n,m,tot,ans;
30int
head[maxn];
31 ll f[maxn][25][3
],q;
32struct
edgee[maxm];
35void insert(int u,int
v);head[u]=tot;
37 e[++tot]=(edge);head[v]=tot;38}
39ll p(ll x)
43void dfs(int x,int
fa)56}57
}58intmain()
63for1(i,m)
67 dfs(1,0
);68 for0(i,21)69
if((f[1][i][0]+f[1][i][1]+f[1][i][2])>0
)73 printf("
-1\n-1");
74return0;
75 }
bzoj1063 NOI2008 道路設計
time limit 20 sec memory limit 162 mb submit 931 solved 509 submit status discuss description z國坐落於遙遠而又神奇的東方半島上,在小z的統治時代公路成為這裡主要的交通手段。z國共有n座城市,一 些城市之間...
bzoj1063 Noi2008 道路設計
樹形dp。這道題的劃分方式和樹鏈剖分類似,但是重路徑能經過根節點,而且要求方案數,所以不能用樹鏈剖分。但是由這種關係可以知道答案很小為log n級別 翻看資料後,確認了答案最大為4。但應該有能使答案更大的資料 用f i j 0 1 2 分別表示,以i為子樹的節點中,不便利值最大的點不便利值為j。0代...
BZOJ1063 NOI2008 道路設計
傳送門 sol 這東西怎麼長了一臉樹鏈剖分的樣子 把公路視為輕邊 發現輕邊的數量是log級別的?dp i j k 表示在節點i,答案為j,這個點向下連 0,1,2 條邊的方案數 直接轉移即可 include using namespace std long long dp 100005 20 4 p...