LOJ:黑暗城堡(最短路)
生活随笔
收集整理的這篇文章主要介紹了
LOJ:黑暗城堡(最短路)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
求一個(gè)圖關(guān)于1的最小路徑樹的方案數(shù)
解析
想復(fù)雜了qwq
跑dij的時(shí)候如果dis[now]+w==dis[to],就使cnt[to]++
如果更新dis,cnt賦值成1
最后乘起來即可
本題可以這樣應(yīng)該是因?yàn)橛捎谶厵?quán)均正,所以所有點(diǎn)的選取方案是獨(dú)立的
所以直接上乘法即可
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define il inline const int N=1e6+100; const int M=150; const int mod=2147483647; const double eps=1e-6; inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } int n,m; struct node{int to,nxt,w; }p[N]; int fi[N],cnt; void addline(int x,int y,int w){p[++cnt]=(node){y,fi[x],w};fi[x]=cnt;return; } int dis[N],num[N]; typedef pair<int,int> pr; #define mkp make_pair priority_queue<pr,vector<pr>,greater<pr> >q; bool vis[N]; void dij(){memset(dis,0x3f,sizeof(dis));dis[1]=0;q.push(mkp(0,1));while(!q.empty()){int now=q.top().second;q.pop();if(vis[now]) continue;vis[now]=1;for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(dis[to]>dis[now]+p[i].w){dis[to]=dis[now]+p[i].w;num[to]=1;q.push(mkp(dis[to],to));}else if(dis[to]==dis[now]+p[i].w) num[to]++;}} } int main(){memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();addline(x,y,z);addline(y,x,z);}dij();ll ans=1;for(int i=2;i<=n;i++) (ans*=num[i])%=mod;printf("%lld\n",ans);return 0; } /* 4 5 3 3 1 9 5 5 5 2 2 2 1 1 1 */ 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的LOJ:黑暗城堡(最短路)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑上的剪映专业版如何调整字幕的内容电脑
- 下一篇: 电脑城买配件真的很黑吗电脑城买配件真的很