求助,双端队列WA#3、#4,用spfaAC了
查看原帖
求助,双端队列WA#3、#4,用spfaAC了
820948
qbhswmy楼主2023/5/30 18:39

双端队列代码

#include <bits/stdc++.h>
using namespace std;
struct node{
	int to,nxt,val;
}edge[20005];
int head[20005]={0},num=0,n,p,k;
void add(int u,int v,int w){
	edge[++num].to=v;
	edge[num].nxt=head[u];
	edge[num].val=w;
	head[u]=num;
	return;
} 
int cnt=0,frt,tmp,dis[1005]={0};
deque <int> q;
bool vis[1005]={0};
bool chk(int x){
	memset(dis,0x3f,sizeof(dis));
	q.push_back(1);
	memset(vis,0,sizeof(vis));
	vis[1]=1;dis[1]=0;
	while(!q.empty()){
		frt=q.front();
		q.pop_front();
		for(int i=head[frt];i;i=edge[i].nxt){
			tmp=edge[i].to;
			if(edge[i].val<=x){
				if(dis[tmp]>dis[frt]){
					dis[tmp]=dis[frt];
					if(!vis[tmp]){
						q.push_front(tmp);
						vis[tmp]=1;
					}
				}
			}
			else if(dis[tmp]>dis[frt]+1){
				dis[tmp]=dis[frt]+1;
				if(!vis[tmp]){
					vis[tmp]=1;
					q.push_back(tmp);
				}
			}
		}
	}
	if(dis[n]>k) return false;
	return true;
}
int main(){
	int u,v,w,l=0,r=0,mid;
	cin>>n>>p>>k;
	for(int i=1;i<=p;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
		r=max(r,w);
	}
	w=r;
	while(l<r){
		mid=(l+r)>>1;//k+1长电话线长度 
		if(chk(mid)) r=mid;//合法,尝试减小长度 
		else l=mid+1;
	}
	if(r==w&&!chk(w)) r=-1;
	cout<<r<<endl;
	return 0;
}

SPFA代码

#include <bits/stdc++.h>
using namespace std;
struct node{
	int to,nxt,val;
}edge[20005];
int head[20005]={0},num=0,n,p,k;
void add(int u,int v,int w){
	edge[++num].to=v;
	edge[num].nxt=head[u];
	edge[num].val=w;
	head[u]=num;
	return;
} 
int cnt=0,frt,tmp,dis[1005]={0};
queue <int> q;
bool vis[1005]={0};
bool chk(int x){
	memset(dis,0x3f,sizeof(dis));
	q.push(1);
	memset(vis,0,sizeof(vis));
	vis[1]=1;dis[1]=0;
	while(!q.empty()){
		frt=q.front();
		q.pop();
		for(int i=head[frt];i;i=edge[i].nxt){
			tmp=edge[i].to;
			if(edge[i].val<=x){
				if(dis[tmp]>dis[frt]){
					dis[tmp]=dis[frt];
					if(!vis[tmp]){
						q.push(tmp);
						vis[tmp]=1;
					}
				}
			}
			else if(dis[tmp]>dis[frt]+1){
				dis[tmp]=dis[frt]+1;
				if(!vis[tmp]){
					vis[tmp]=1;
					q.push(tmp);
				}
			}
		}
		vis[frt]=0;
	}
	if(dis[n]>k) return false;
	return true;
}
int main(){
	int u,v,w,l=0,r=0,mid;
	cin>>n>>p>>k;
	for(int i=1;i<=p;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
		r=max(r,w);
	}
	w=r;
	while(l<r){
		mid=(l+r)>>1;//k+1长电话线长度 
		if(chk(mid)) r=mid;//合法,尝试减小长度 
		else l=mid+1;
	}
	if(r==w&&!chk(w)) r=-1;
	cout<<r<<endl;
	return 0;
}
2023/5/30 18:39
加载中...