玄学问题
查看原帖
玄学问题
549521
boy♂Next♂dooor楼主2024/7/19 11:25

题源是https://www.acwing.com/problem/content/description/351/

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1005,M=1e6,mod=INT_MAX;
struct edge{
   int v,w;
};
int d[N];
ll s[N];
bool vis[N];
vector<edge> g[M];
void dijsktra()
{
   priority_queue<pair<int,int> > q;
   memset(d,0x3f,sizeof(d));
   d[1]=0;
   q.push(make_pair(0,1));
   while(!q.empty())
   {
   	int x=q.top().second;
   	q.pop();
   	if(vis[x]) continue; 
   	vis[x]=1;
   	for(int i=0;i<g[x].size();i++)
   	{
   		int to=g[x][i].v;
   		int dis=g[x][i].w;
   		if(/*!vis[to]&&*/d[to]>dis+d[x])
   		{
   			d[to]=dis+d[x];
   			//v[to]=1;
   			//cout<<d[to]<<endl; 
   			q.push(make_pair(-d[to],to));
   		}
   		
   	}
   }
}
int n,m;
int main()
{
   cin>>n>>m;
   for(int i=1;i<=m;i++)
   {
   	int x,y,l;
   	cin>>x>>y>>l;
   	g[x].push_back({y,l});
   	g[y].push_back({x,l});
   }
   dijsktra();
   //for(int i=1;i<=n;i++) cout<<d[i]<<endl;
   ll ans=1;
   s[1]=1;
   for(int i=1;i<=n;i++)
   {
   	for(int j=0;j<g[i].size();j++)
   	{
   		int to=g[i][j].v;
   		int dis=g[i][j].w;
   		if(d[to]==d[i]+dis)
   		{	
   			s[to]++;	
   			//cout<<to<<" "<<dis<<" "<<s[to]<<endl;
   		}	
   	}
   }
   //for(int i=1;i<=n;i++) cout<<s[i]<<endl;
   for(int i=1;i<=n;i++)
   {
   	ans*=s[i]%mod;//ans = ans * s[i] % mod;
   }
   cout<<ans;
	return 0;
}

ans*=s[i]%mod;改ans = ans * s[i] % mod;后AC? 原因不明 这2个还有什么区别吗??

2024/7/19 11:25
加载中...