关于spfa
  • 板块学术版
  • 楼主caramel_qwq
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/8/13 16:26
  • 上次更新2023/10/27 15:35:58
查看原帖
关于spfa
444195
caramel_qwq楼主2022/8/13 16:26

他死了(bushi

蒟蒻要求一个无向无环图上的给定的两点的最短路和最长路,边权都是1,用dijkstra写了最短路没啥问题,但是用spfa写最长路时不知道为什么死循环了,求教。

#include<bits/stdc++.h>
#define INF 0x3f
using namespace std;
const int MAXN=5e5+8;
typedef pair<int,int> pii;
vector<int> a[MAXN];
int n,Q,S,V,minans,maxans;
int d[MAXN],dis[MAXN];
bool vis[MAXN];
void dijkstra(){
	memset(vis,0,sizeof(vis));
	memset(d,INF,sizeof(d));
	priority_queue< pii,vector<pii>,greater<pii> > q;
	d[S]=1;
	q.push(make_pair(1,S));
	while(!q.empty()){
		int x=q.top().second;
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=0;i<a[x].size();i++){
			int y=a[x][i],z=1;
			d[y]=min(d[y],d[x]+1);
			q.push(make_pair(d[y],y));
		}
	}
	minans=d[V];
	return ;
}
void spfa(){
	memset(dis,-1,sizeof(dis));
	memset(vis,0,sizeof(vis));
	queue<int> q;
	dis[S]=1,vis[S]=1;
	q.push(1);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=0;i<a[x].size();i++){
			int y=a[x][i],z=1;
			if(dis[x]!=-1&&dis[x]+z>dis[y]){
				dis[y]=dis[x]+z;
				if(!vis[y]) q.push(y),vis[y]=1;
			}
		}
	}
	maxans=dis[V];
	return ;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		a[x].push_back(y);
		a[y].push_back(x);
	}
	scanf("%d",&Q);
	for(int i=1;i<=Q;i++){
		scanf("%d%d",&S,&V);
		minans=n,maxans=1;
		dijkstra();
		spfa();
		printf("%d %d\n",minans,maxans);
	}
	return 0;
}
2022/8/13 16:26
加载中...