他死了(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;
}