一本通1486 例題1 黑暗城堡

2022-05-01 04:03:07 字數 2119 閱讀 5136

知道黑暗城堡有 n 個房間, m 條可以製造的雙向通道,以及每條通道的長度。

城堡是樹形的並且滿足下面的條件:

設$ d_i$為如果所有的通道都被修建,第 i 號房間與第 1 號房間的最短路徑長度;

而 \(s_i\) 為實際修建的樹形城堡中第$ i$ 號房間與第$ 1 $號房間的路徑長度;

要求對於所有整數 \(i(1≤i≤n)\),有$ s_i=d_i$ 成立。

你想知道有多少種不同的城堡修建方案。當然,你只需要輸出答案對 \(2^−1\) 取模之後的結果就行了。

第一行為兩個由空格隔開的整數 \(n,m\);

第二行到第 \(m+1\) 行為 \(3\) 個由空格隔開的整數$ x,y,l$:表示 \(x\) 號房間與$ y$ 號房間之間的通道長度為 \(l\)。

乙個整數:不同的城堡修建方案數對\(2^-1\) 取模之後的結果。

4 6

1 2 1

1 3 2

1 4 3

2 3 1

2 4 2

3 4 1

6
樣例說明

一共有$ 4$ 個房間,\(6\) 條道路,其中 1 號和$ 2$ 號,$ 1 $號和 3 號,\(1\) 號和 \(4\) 號,\(2\) 號和$ 3$ 號,\(2\) 號和 $4 $號,\(3\) 號和 \(4\) 號房間之間的通道長度分別為$ 1,2,3,1,2,1。$

而不同的城堡修建方案數對 $2^−1 $取模之後的結果為 \(6\)。

資料範圍:

對於全部資料,\(1≤n≤1000,1≤m≤ \dfrac,1≤l≤200。\)

先用\(dijkstra\)求出1號房間到每個房間的單源最短路徑儲存到\(dis\)陣列中。把樹形城堡看作以1為根的有根樹。由題,若\(x\)是\(y\)的根節點,\(x、y\)之間的通道長度為\(z\),則應該有:\(dis[y]=dis[x]+z\)。事實上,我們把滿足題目要求的樹結構,即對任意一對父子結點\(x、y\)都有上式成立的樹結構,稱為圖的一棵最短路徑生成樹。與\(prim\)演算法類似,統計有多少結點\(x\)滿足\(dis[p]=dis[x]+e[x][p]\),讓\(p\)與其中任意乙個x相連都符合題目要求。

最短路徑生成樹:對於任意一對父子結點\(x、y\)均滿足\(dis[y]=dis[x]+e[x][y]\)的樹結構稱為圖的一棵最短路徑生成樹;

在巨集定義中!! \(2^\) 寫為  \((1<<31)-1\)  要加括號!! 要加括號!! 不然就會\(wa\)好多好多次了...

然後,不要忘了給\(e\)陣列初始化....不然就預設為0了..

這題資料範圍比較小,所以可以用鄰接矩陣,不過這個是樹,稀疏圖,一般是用鄰接表的。

#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

inline ll read()

while(isdigit(ch)) s=s*10+ch-'0',ch=getchar();

return s*w;

}int n,m;

ll dis[1010][1010],g[20000],cnt[20000];

bool vis[2000000]=;

int main()

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

g[i]=dis[1][i];

for(int i=1;i<=n;i++)//2.用dijkstra演算法求出一號房間到每個房間的最短路

ll ans=1;

for(int i=1;i<=n;i++)//3.方案累加

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

if(i!=j&&g[j]==g[i]+dis[i][j])

cnt[j]++;

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

if(cnt[i])

ans*=cnt[i],ans%=2147483647;

printf("%lld",ans);

return 0;

}

一本通1597 例 1 滑動視窗

時間限制 1000 ms 記憶體限制 524288 kb 題目描述 原題來自 poj 2823 給乙個長度為 n的陣列,乙個長為 k 的滑動窗體從最左端移至最右端,你只能看到視窗中的 k個數,每次窗體向右移動一位,如下圖 你的任務是找出窗體在各個位置時的最大值和最小值。輸入格式 第 1 行 兩個整數...

一本通 1 1 例 1 活動安排

題目link 貪心即可,將活動按右端點排序,排序後能選則選。o n 證明 首先對於乙個前面都為最優序列的前提下,如果對於乙個活動 a 使它發生是一種最優序列,然後再對於另乙個活動 b 它的結束時間比 a 早,並且開始時間也滿足條件,那麼根據貪心就可以選它,因為它既合法又是一種最優序列。1 inclu...

一本通1600 例 4 旅行問題

時間限制 1000 ms 記憶體限制 524288 kb 原題來自 poi 2004 john 打算駕駛一輛汽車周遊乙個環形公路。公路上總共有 n n 車站,每站都有若干公升汽油 有的站可能油量為零 每公升油可以讓汽車行駛一千公尺。john 必須從某個車站出發,一直按順時針 或逆時針 方向走遍所有的...