在同一道题目中用dijkstra能ac,用spfa有些点只对了一半(最短路对了最短路计数错了),这是为什么?
void dijkstra(int start,int* ans,int* ways){
pair<int,int> pqf;
memset(in,0,sizeof(in));
for (int i=1;i<=n;i++) if (i!=start) ans[i]=1145141919810;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
pq.push(make_pair(0,start));
ways[start]=1;
while (!pq.empty()){
pqf=pq.top();
pq.pop();
if (in[pqf.second]) continue;
in[pqf.second]=1;
for (auto i:adj[pqf.second]){
if (ans[i.second]==pqf.first+i.first) {
ways[i.second]+=ways[pqf.second];
}
else if (ans[i.second]>pqf.first+i.first){
ways[i.second]=ways[pqf.second];
ans[i.second]=pqf.first+i.first;
pq.push(make_pair(pqf.first+i.first,i.second));
}
ways[i.second]%=MOD;
}
}
}
void spfa(int start,int* ans,int* ways){
memset(in,0,sizeof(in));
for (int i=1;i<=n;i++) if (i!=start) ans[i]=1145141919810;
queue<int> q;
ways[start]=1;
q.push(start);
int qf;
while (!q.empty()){
qf=q.front();
q.pop();
in[qf]=0;
for (auto i:adj[qf]){
if (ans[i.second]>ans[qf]+i.first) {
ans[i.second]=ans[qf]+i.first;
ways[i.second]=ways[qf];
if (!in[i.second]) {
in[i.second]=1;
q.push(i.second);
}
}
else if (ans[i.second]==ans[qf]+i.first) ways[i.second]+=ways[qf];
ways[i.second]%=MOD;
}
}
}