代码求调
  • 板块学术版
  • 楼主ztjp13
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/8/13 22:07
  • 上次更新2023/10/27 15:32:43
查看原帖
代码求调
342941
ztjp13楼主2022/8/13 22:07

P1462,dij不知为何死循环,哪位大佬帮帮忙

#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int MAXN=0x7fffffff;
const int N=10005;
const int M=5*10005;

int n,m,b,tot;
int ver[M],edge[M],head[N],Next[M];

int f[N];
int l,r;

ll dis[N];
bool vis[N];

struct node{
	int val,id;
	bool operator <(const node b)const{
		return val>b.val; 
	}
};
priority_queue<node>q;

void add(int x,int y,int z){
	ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
}

bool dij(int pri){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[1]=0;
	q.push(node{0,1});
	while(!q.empty()){
		int x=q.top().id; q.pop();
		if(vis[x]) continue;
		vis[x]=true;
		for(int i=head[x];i;i=Next[i]){
			int y=ver[i],z=edge[i];
			if(dis[y]>dis[x]+z&&f[y]<=pri){
				dis[y]=dis[x]+z;
				q.push(node{dis[y],y});
			}
		}
	}
	return dis[n]<=b;
}

int main(){
	cin>>n>>m>>b;
	for(int i=1;i<=n;i++){
		cin>>f[i];
		r=max(r,f[i]);
	}
	l=max(f[1],f[n]);
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	if(!dij(r)){
		cout<<"AFK"<<endl;
		return 0;
	}
	while(l<=r){
		int mid=(l+r-1)>>1;
		if(dij(mid)) r=mid;
		else l=mid;
	}
	cout<<l<<endl;
	return 0;
} 
2022/8/13 22:07
加载中...