傳送門
解析
這道書上例題主要用dijkstra演算法解決,但是關鍵的一步是如何計算有多少種方案。
「統計有多少個節點滿足x屬於t,並且dis[p]=dis[x]+edge(x,p)」,其中edge表示邊的長度。
根據乘法原理,我們把每一步統計出的數量乘起來,就得到了題目的結果。
#include#define inf 1e12;using
namespace
std;
intn,m;
long
long dis[1010][1010],g[20000],cnt[20000
];bool vis[2000000]=;
intmain()
intx,y,z;
for(int i=1;i<=m;i++)
}for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)//
二、用迪傑斯特拉演算法求出一號房間到每個房間的單源最短路
}vis[u]=1
;
for(int j=1;j<=n;j++)}}
long
long ans=1
;
for(int i=1;i<=n;i++)//
三、方案累加
}for(int i=1;i<=n;i++)
cout
<}
黑暗城堡 (最小生成樹 最短路)
咕咕咕 prim的特點是從乙個點開始,不斷把距離最短的點加入圖中,在以此延伸。是一種貪心的想法。當知道prim的特點的時候,就可以想到這題用prim。這題又要求實際路徑 最短路徑,也可以想到用dijkstra。具體做法 用dijkstra求出1號犯賤到每個房間的單元最短路。把樹形城堡看做以1為根的有...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹
package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...