咕咕咕
prim的特點是從乙個點開始,不斷把距離最短的點加入圖中,在以此延伸。是一種貪心的想法。當知道prim的特點的時候,就可以想到這題用prim。
這題又要求實際路徑=最短路徑,,也可以想到用dijkstra。
具體做法:
用dijkstra求出1號犯賤到每個房間的單元最短路。把樹形城堡看做以1為根的有根樹。
把所有節點按照dis值排序,從小到大一次考慮吧每個節點p加入樹形城堡有多少種方法。
和prim類似,維護「最短路徑生成樹」的一部分記為t
統計有多少個節點x滿足,x∈t並且dis[ p ] = dis [ x ] + edge ( x , p ),其中edge表示邊的長度。
讓p與其中任意乙個x項鍊都符合題目的要求。
根據乘法原理,把每一步統計出的資料乘起來,即可得答案。
#include#include#include
#include
#define mk make_pair
#define ll long long
using
namespace
std;
inline
intread()
while(ch >= '
0' && ch <= '9'
)
return sum *p;
}const
int m = 5e5 + 10
;const
int n = 1e3 + 5
;const
int mod = 2147483647
;int
n,m;
inthead[n],cnt;
struct
edge
e[m<<1
];priority_queue
int,int> >q;
bool
vis[n];
intdis[n],sum[n];
struct
potp[n];
void add(int x,int y,int v)//
加邊 void
dijkstra()} }
}bool
cmp(pot a,pot b)
intmain()
dijkstra();
//for(int i = 1;i <= n;i++)
//printf("%d-===-%d\n",i,dis[i]);
//puts("\n");
for(int i = 1;i <= n;i++)
sort(p+1,p+n+1
,cmp);
memset(vis,
false,sizeof
(vis));
vis[
1] = true
;
for(int i = 2;i <= n;i++)
}//for(int i = 1;i <= n;i++)
//printf("%d----%d\n",i,sum[i]);
ll ans = 1
;
for(int i = 2;i <= n;i++)
ans = (ans * sum[i])%mod;
printf(
"%lld
",ans);
return0;
}
黑暗城堡(最小生成樹)
傳送門 解析 這道書上例題主要用dijkstra演算法解決,但是關鍵的一步是如何計算有多少種方案。統計有多少個節點滿足x屬於t,並且dis p dis x edge x,p 其中edge表示邊的長度。根據乘法原理,我們把每一步統計出的數量乘起來,就得到了題目的結果。include define in...
黑暗城堡(最短路徑樹)
黑暗城堡 castle.pas c cpp 題目描述 在順利攻破 lord lsp 的防線之後,lqr 一行人來到了 lord lsp 的城堡下方。lord lsp 黑化 之後雖然擁有了強大的超能力,能夠用意念力製造建築物,但是智商水平卻沒怎麼增加。現 在 lqr 已經搞清楚黑暗城堡有 n 個房間,...
CH6202 黑暗城堡(最短路徑生成樹)
傳送門 通過學習我們可以發現原題目要求的樹結構就是 最短路徑生成樹 什麼是最短路徑生成樹呢?就是一張圖的源點到圖中的所有結點的最短路徑構成的樹,為什麼他滿足樹結構呢?因為假設有n個點,因為是最短路徑一定只有n 1條邊把他連起來。那對於本題,每個點的d i d i d i 可以先跑一遍dij kstr...