关于最短路计数。
查看原帖
关于最短路计数。
361141
_JF_殉情楼主2024/7/6 19:41
#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;
}

这一份代码,我在判断的时候记录了到 pip_i 的最短路的数量来进行一个判断,但是它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\text{tot} 的值和第一份到 pip_i 的最短路数量有什么区别吗?

百思不得其解,感觉是自己的最短路计数写错了,但是没看出来。。。

2024/7/6 19:41
加载中...