#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define int long long
vector<int> g[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
int dis[N],Sum[N],p[N],n,m,Q;
bool vis[N];
void Dijkstra(int s){
for(int i=1;i<=n;i++) dis[i]=1e18;
dis[s]=0,Sum[s]=1,q.push({0,s});
while(!q.empty()){
int u=q.top().second;q.pop();
vis[u]=true;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(dis[v]<dis[u]+1) continue;
else if(dis[v]==dis[u]+1) Sum[v]+=Sum[u];
else{
dis[v]=dis[u]+1,Sum[v]=Sum[u];
if(!vis[v]) q.push({dis[v],v});
}
}
}
}
signed main(){
cin>>n>>m;
for(int i=1,u,v;i<=m;i++) cin>>u>>v,g[v].push_back(u);
cin>>Q;
for(int i=1;i<=Q;i++) cin>>p[i];
Dijkstra(p[Q]);
// for(int i=1;i<=Q;i++) cout<<p[i]<<" "<<dis[p[i]]<<endl;
int Least=0,Most=0;
for(int i=1;i<Q;i++){
int now=i+1;
if(dis[p[i]]==(dis[p[now]]+1)){
if(Sum[p[i]]>1) Most++;
}
else
Least++,Most++;
}
cout<<Least<<" "<<Most<<endl;
return 0;
}
这一份代码,我在判断的时候记录了到 pi 的最短路的数量来进行一个判断,但是它WA on 5。
于是我参考了题解,改成这样:
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define int long long
vector<int> g[N],G[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
int dis[N],Sum[N],p[N],n,m,Q;
bool vis[N];
void Dijkstra(int s){
for(int i=1;i<=n;i++) dis[i]=1e18;
dis[s]=0,Sum[s]=1,q.push({0,s});
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u]==true) continue;
vis[u]=true;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1,Sum[v]=Sum[u];
q.push({dis[v],v});
}
else if(dis[v]==dis[u]+1) Sum[v]+=Sum[u];
}
}
}
signed main(){
cin>>n>>m;
for(int i=1,u,v;i<=m;i++) cin>>u>>v,g[v].push_back(u),G[u].push_back(v);
cin>>Q;
for(int i=1;i<=Q;i++) cin>>p[i];
Dijkstra(p[Q]);
int Least=0,Most=0;
for(int i=1;i<Q;i++){
int now=i+1;
if(dis[p[i]]==dis[p[now]]+1){
int tot=0;
for(int j=0;j<G[p[i]].size();j++) if(dis[G[p[i]][j]]+1==dis[p[i]]) tot++;
if(tot>1) Most++;
}
else
Least++,Most++;
}
cout<<Least<<" "<<Most<<endl;
return 0;
}
感觉统计的 tot 的值和第一份到 pi 的最短路数量有什么区别吗?
百思不得其解,感觉是自己的最短路计数写错了,但是没看出来。。。