#10064 「一本通 3.1 例 1」黑暗城堡
Posted songjian-jiansong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#10064 「一本通 3.1 例 1」黑暗城堡相关的知识,希望对你有一定的参考价值。
- https://loj.ac/problem/10064
- 思路:先跑一遍spfa最短路*双向图的vector用法*,再找dis[v]==dis[i]+e[i][j].dis,cnt[v]++,最后乘法原理将所有cnt[v]乘一遍,记得%
- 代码:
#include<bits/stdc++.h> #define ll long long #define mo 2147483647 using namespace std; ll n,m,tot,head[1005],vis[1005],cnt[1005],dis[1005],ans=1; struct node{ ll to,dis; }; vector<node>e[1005]; void spfa(){ memset(dis,0x3f,sizeof(dis)); queue<ll>q; vis[1]=1; dis[1]=0; q.push(1); while(!q.empty()){ ll u=q.front(); vis[u]=0; q.pop(); for(ll i=0;i<e[u].size();i++){ ll v=e[u][i].to,w=e[u][i].dis; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ cin>>n>>m; for(ll i=1;i<=m;i++){ ll u,v,w; cin>>u>>v>>w; e[u].push_back({v,w}); e[v].push_back({u,w}); } spfa(); for(ll i=1;i<=n;i++){ for(ll j=0;j<e[i].size();j++){ int v=e[i][j].to; if(dis[i]+e[i][j].dis==dis[v])cnt[v]++; } } for(ll i=2;i<=n;i++){ ans*=cnt[i]; ans%=mo; } cout<<ans<<endl; return 0; }
以上是关于#10064 「一本通 3.1 例 1」黑暗城堡的主要内容,如果未能解决你的问题,请参考以下文章