dijk板子改了一晚上,帮忙看看吧
查看原帖
dijk板子改了一晚上,帮忙看看吧
180453
wangyansong楼主2020/10/29 21:40
#include<bits/stdc++.h>
using namespace std;
#define maxn 1001000
#define inf 0x3f3f3f3f
int n,m,hp,dis[maxn],head[maxn],c[maxn],b[maxn],vis[maxn],cnt;
struct edge{
	int v,next,w;
}e[maxn];
struct node{
	int w,now;
	inline bool operator<(const node &x)const{
		return w>x.w;
		}
};
inline int add(int x,int y,int w){
	e[++cnt].v=y;
	e[cnt].w=w;
	e[cnt].next=head[x];
	head[x]=cnt;
}
inline int read(){
	int x=0,k=1;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')k=-1;ch=getchar();
	}
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*k;
}
priority_queue<node> q;
void check(int x)
{
	memset(vis,0,sizeof(vis));
	memset(dis,inf,sizeof(dis));
	dis[1]=0;
	while(!q.empty())q.pop();
	q.push((node){0,1});
	while(!q.empty()){
		node x=q.top();q.pop();
		int u=x.now;
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].v;
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				if(!vis[v]){
					q.push((node){dis[v],v});
				}
			}
		}
	}
//	cout<<dis[n];
}
int main()
{
	n=read(),m=read(),hp=read();
	int l=1,r=0,mid,ans=0;
	for(int i=1;i<=n;++i){
		scanf("%d",b+i);//,c[i]=b[i];
		r=max(r,b[i]);
	}
	l=max(b[1],b[n]);
//	cout<<l<<" "<<r<<endl;
	for(int i=1;i<=m;++i){
		int x,y,z;
		x=read(),y=read(),z=read();
		add(x,y,z);
		add(y,x,z);
	}
//	sort(c+1,c+n+1);
	while(l<r){
	//	cout<<mid<<" ";
		mid=(l+r)>>1;
		check(mid);
		if(dis[mid]>hp)l=mid+1;
		else r=mid;
	}
	check(1);
	if(dis[n]>hp) cout<<"AFK";
	else cout<<l;
}
2020/10/29 21:40
加载中...