黑暗城堡
最短路径树计数
树的计数问题 我们考虑类似prim的方式 维护树的一部分 这样就可以用乘法原理了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define mp make_pair
#define pa pair<int,int>
#define pb push_back
#define ll long long
using namespace std;
const int N=1010;
const int M=1e6+10;
int read()
{
int x=0,f=0,c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}
struct Edge
{
int to,next,w;
}e[M];
int edge[N][N];
int head[N],cnt;
void _add(int a,int b,int c){ e[++cnt]=(Edge){b,head[a],c}; head[a]=cnt;}
void add(int a,int b,int c){ _add(a,b,c); _add(b,a,c);}
int d[N];
bool vis[N];
priority_queue< pa > q;
struct Node
{
int d,id;
}p[N];
bool cmp(Node a,Node b)
{
return a.d<b.d;
}
vector <int> st;
int n,m;
void dij()
{
memset(d,0x3f,sizeof d);
q.push( mp(0,1) ); d[1]=0;
while(q.size())
{
int x=q.top().second; q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
if(d[y]>d[x]+e[i].w)
{
d[y]=d[x]+e[i].w;
q.push(mp(-d[y],y));
}
}
}
for(int i=1;i<=n;i++) p[i].d=d[i],p[i].id=i;
}
int main()
{
n=read(); m=read();
memset(edge,0x3f,sizeof edge);
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z); edge[x][y]=edge[y][x]=z;
}
dij();
sort(p+1,p+n+1,cmp);
memset(vis,0,sizeof vis);
st.pb(1); vis[1]=1;
ll ans=1;
for(int i=1;i<=n;i++)
{
if(vis[p[i].id]) continue;
int x=p[i].id,tmp=0;
for(int j=0;j<st.size();j++)
{
int y=st[j];
if(d[x]==d[y]+edge[x][y]) tmp++;
}
vis[x]=1; st.pb(x);
ans=(ll)ans*tmp%((1ll<<31)-1);
}
cout<<ans<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】