黑暗城堡-(最小生成树+最短路)
生活随笔
收集整理的這篇文章主要介紹了
黑暗城堡-(最小生成树+最短路)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咕咕咕
?
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<cstdio> #include<algorithm> #include<queue> #include<cstring> #define mk make_pair #define ll long long using namespace std; inline int read() {int sum = 0,p = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-')p = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){(sum *= 10) += ch - '0';ch = getchar();} return sum * p; }const int M = 5e5 + 10; const int N = 1e3 + 5; const int mod = 2147483647; int n,m; int head[N],cnt; struct edge {int nxt,to,wei; }e[M<<1]; priority_queue<pair<int,int> > q; bool vis[N]; int dis[N],sum[N]; struct pot {int id,dis; }p[N];void add(int x,int y,int v)//加邊 {e[++cnt].nxt = head[x];e[cnt].to = y;e[cnt].wei = v;head[x] = cnt; }void dijkstra() {memset(dis,0x3f,sizeof(dis));dis[1] = 0;q.push(mk(0,1));while(q.size()){int u = q.top().second;q.pop();if(vis[u])continue;vis[u] =true;for(int i = head[u];i;i = e[i].nxt){int v = e[i].to;if(dis[u] + e[i].wei < dis[v]){dis[v] = dis[u] +e[i].wei;q.push(mk(-dis[v],v));}} } }bool cmp(pot a,pot b) {return a.dis < b.dis; }int main() {n = read(),m = read();for(int i = 1;i <= m;i++){int x = read(),y = read(),l = read();add(x,y,l);add(y,x,l); } dijkstra();// for(int i = 1;i <= n;i++) // printf("%d-===-%d\n",i,dis[i]); // puts("\n");for(int i = 1;i <= n;i++){p[i].id = i;p[i].dis = dis[i];}sort(p+1,p+n+1,cmp);memset(vis,false,sizeof(vis));vis[1] = true;for(int i = 2;i <= n;i++){vis[p[i].id] = true;for(int j = head[p[i].id];j;j = e[j].nxt){int v = e[j].to;if(vis[v] && dis[v] + e[j].wei == p[i].dis)sum[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);return 0; }?
轉載于:https://www.cnblogs.com/darlingroot/p/11278752.html
總結
以上是生活随笔為你收集整理的黑暗城堡-(最小生成树+最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring cloud @Refres
- 下一篇: ArcGIS API for Silve