1063 Noi2008 道路設計

2022-05-12 09:48:09 字數 3424 閱讀 2939

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 #include

8 #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 }

view code

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...