学校网站建设论文,建筑网络工程教程,织梦网站代码,对象存储链接WordPress题目描述
求一个图关于1的最小路径树的方案数
解析
想复杂了qwq 跑dij的时候如果dis[now]wdis[to]#xff0c;就使cnt[to] 如果更新dis#xff0c;cnt赋值成1 最后乘起来即可 本题可以这样应该是因为由于边权均正#xff0c;所以所有点的选取方案是独立的 所以直接上乘法…题目描述
求一个图关于1的最小路径树的方案数
解析
想复杂了qwq 跑dij的时候如果dis[now]wdis[to]就使cnt[to] 如果更新discnt赋值成1 最后乘起来即可 本题可以这样应该是因为由于边权均正所以所有点的选取方案是独立的 所以直接上乘法即可
代码
#includebits/stdc.h
using namespace std;
#define ll long long
#define il inline
const int N1e6100;
const int M150;
const int mod2147483647;
const double eps1e-6;
inline ll read(){ll x0,f1;char cgetchar();while(!isdigit(c)){if(c-) f-1;cgetchar();}while(isdigit(c)){xx*10c-0;cgetchar();}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 pairint,int pr;
#define mkp make_pair
priority_queuepr,vectorpr,greaterpr q;
bool vis[N];
void dij(){memset(dis,0x3f,sizeof(dis));dis[1]0;q.push(mkp(0,1));while(!q.empty()){int nowq.top().second;q.pop();if(vis[now]) continue;vis[now]1;for(int ifi[now];~i;ip[i].nxt){int top[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;nread();mread();for(int i1;im;i){int xread(),yread(),zread();addline(x,y,z);addline(y,x,z);}dij();ll ans1;for(int i2;in;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
*/