一定要看清楚数组开多大,否则就会像如下这篇WA代码一样
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
ll n,m,cnt,u,v,w;
ll first[500005], dis[500005], visit[500005],sum[500005];
struct node{
ll to,next,w;
}edge[500005];
inline void add(ll u ,ll v,ll w){
cnt++;
edge[cnt].to = v;
edge[cnt].next = first[u];
edge[cnt].w = w;
first[u] = cnt;
}
typedef pair<ll,ll> p;
priority_queue<p,vector<p>,greater<p> > que;
int main(){
//ios::sync_with_stdio(false);
//cin.tie(0),cout.tie(0);
cin >> n >> m;
for(ll i = 1;i <= m;i++){
cin >> u >> v;
add(u,v,1);
add(v,u,1);
}
ll s = 1;
for(ll i = 1;i <= n;i++){
dis[i] = INT_MAX;
}
dis[s] = 0;
sum[s] = 1;
que.push(make_pair(dis[s],s));
while(!que.empty()){
u = que.top().second;
que.pop();
if(visit[u] == 1) continue;
visit[u] = 1;
for(ll i = first[u];i != 0;i = edge[i].next){
v= edge[i].to;
if(dis[v] > dis[u]+edge[i].w){
dis[v] = dis[u]+edge[i].w;
que.push(make_pair(dis[v] , v));
sum[v] = sum[u];
}
else if(dis[v] == dis[u]+edge[i].w){
sum[v] = (sum[v]+sum[u])%100003;
}
}
}
for(ll i = 1;i <= n;i++){
cout << sum[i] % 100003 << endl;
}
return 0;
}
这篇代码错因在于数组开小了
但此时OJ最后一点会报WA而并非RE,让人痛不欲生