求助
查看原帖
求助
127925
Kio_楼主2020/11/2 21:50

思路:二分答案,bfs判断可达性

不知道为啥写挂了......(全WA)

求大佬答疑qwq

#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#define ll long long
using namespace std;
int n,m,b;
int w[10020],px[10020];//w为题目中各点的点权,px为排序后的点权,方便后面二分 
struct pt{
	int id,v;
};
vector<pt> v[10020];
bool check(int vmax){//bfs判断可达性 
	if(w[1]>vmax||w[n]>vmax)return 0;
	queue<pt> q;
	bool pd[10020];
	for(int i=1;i<=n;i++) pd[i] = 0;
	q.push((pt){1,w[1]});
	while(!q.empty()){
		int xid = q.front().id, xv = q.front().v;
		q.pop();
		if(xid == n)return 1;
		if(pd[xid])continue;
		pd[xid] = 1;
		for(int i=0;i<v[xid].size();i++){
			int yid = v[xid][i].id, yv = v[xid][i].v;
			if(!pd[yid] && xv + yv <= b && vmax<=w[yid]) q.push((pt){yid,xv+yv});
		}
	}
	return 0;
}
int read()
{
	int num=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while('0'<=c&&c<='9')num=num*10+c-'0',c=getchar();
	return num;
}
int main(){
	n=read(),m=read(),b=read();
	for(int i=1;i<=n;i++) w[i] = read(), px[i] = w[i], sum+=w[i];
	sort(px+1,px+n+1);
	for(int i=1;i<=m;i++){
		int ui=read(),vi=read(),wi=read();
		v[ui].push_back((pt){vi,wi});
		v[vi].push_back((pt){ui,wi});
	}
	int l=1,r=n;
	while(l<r){
		int mid = (l+r)>>1;
		if(check(px[mid])) r = mid;
		else l = mid + 1;
	}
	printf("%d",px[l]);
}
2020/11/2 21:50
加载中...