社区讨论

求助,int80分,long long60分

P1462通往奥格瑞玛的道路参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lzs2ps0b
此快照首次捕获于
2024/08/13 15:00
2 年前
此快照最后确认于
2024/08/13 16:42
2 年前
查看原帖
int版本
CPP
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,m,b,f[10005],dis[10005];
bool vis[10005];
vector<pair<int,int> > v[10005];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
bool dij(int s){
	while(!q.empty()){
		q.pop();
	}
	for(int i=1;i<=n;i++){
		dis[i]=INT_MAX/2;
	}
	memset(vis,0,sizeof(vis));
	q.push({0,1});
	dis[1]=0;
	while(!q.empty()){
		int x=q.top().second;
		q.pop();
		if(!vis[x]){
			vis[x]=1;
			for(int i=0;i<v[x].size();i++){
				int y=v[x][i].first;
				int w=v[x][i].second;
				if(f[y]<=s&&dis[y]>dis[x]+w){
					dis[y]=dis[x]+w;
					if(!vis[y]){
						q.push({dis[y],y});
					}
				}
			}
		}
	}
	return dis[n]!=INT_MAX/2;
}
signed main(){
	cin>>n>>m>>b;
	for(int i=1;i<=n;i++){
		cin>>f[i];
	}
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		v[x].push_back({y,z});
		v[y].push_back({x,z});
	}
	if(!dij(1e9+1)){
		cout<<"AFK";
		return 0;
	}
	int l=f[1]-1,r=1e9+1;
	while(l+1<r){
		int mid=(l+r)>>1;
		if(dij(mid)){
			r=mid;
		}else{
			l=mid;
		}
	}
	cout<<r;
	return 0;
}
long long版本
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,b,f[10005],dis[10005];
bool vis[10005];
vector<pair<int,int> > v[10005];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
inline bool dij(int s){
	while(!q.empty()){
		q.pop();
	}
	for(int i=1;i<=n;i++){
		dis[i]=1e14;
	}
	memset(vis,0,sizeof(vis));
	q.push({0,1});
	dis[1]=0;
	while(!q.empty()){
		int x=q.top().second;
		q.pop();
		if(!vis[x]){
			vis[x]=1;
			for(int i=0;i<v[x].size();i++){
				int y=v[x][i].first;
				int w=v[x][i].second;
				if(f[y]<=s&&dis[y]>dis[x]+w){
					dis[y]=dis[x]+w;
					if(!vis[y]){
						q.push({dis[y],y});
					}
				}
			}
		}
	}
	return dis[n]!=1e14;
}
signed main(){
	cin>>n>>m>>b;
	for(int i=1;i<=n;i++){
		cin>>f[i];
	}
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		v[x].push_back({y,z});
		v[y].push_back({x,z});
	}
	if(!dij(1e15)){
		cout<<"AFK";
		return 0;
	}
	int l=f[1]-1ll,r=1e10+1;
	while(l+1<r){
		int mid=(l+r)>>1;
		if(dij(mid)){
			r=mid;
		}else{
			l=mid;
		}
	}
	cout<<r;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...