警示后人(如果WA最后一点)
查看原帖
警示后人(如果WA最后一点)
772284
Justskr楼主2024/5/5 12:30

一定要看清楚数组开多大,否则就会像如下这篇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,让人痛不欲生

2024/5/5 12:30
加载中...