kristinakawayi @ 2021-04-12 17:14:19
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
struct node{
int to;
int blood;
};
struct point{
int position;
int co;
bool operator <(const point &t) const{
return co<t.co;
}
};
int n,m,b;
int used[10010];
int cost[10010];
int cop[10010];//用来二分的复制数组
int dist[10010];
vector <node> G[10010];
int mi;//记录最小值
bool dj(int s){
if(s<cop[1]||s<cop[n])return false;//初始和结束都走不了说明不行
memset(used,0,sizeof(used));
memset(dist,inf,sizeof(dist));
for(int i=1;i<=n;i++){
if(cost[i]>s){
used[i]=1;
}
}
priority_queue<point> que;
dist[1]=0;
point temp;
temp.position=1;
temp.co=0;
que.push(temp);
while(!que.empty()){
temp=que.top();
que.pop();
int u=temp.position;
if(used[u])continue;
used[u]=1;
for(int i=0;i<G[u].size();i++){
node no=G[u][i];
if(dist[no.to]>dist[u]+no.blood){
dist[no.to]=dist[u]+no.blood;
temp.position=no.to;
temp.co=dist[no.to];
que.push(temp);
}
}
}
if(dist[n]<b)return true;
else return false;
}
int main(){
cin>>n>>m>>b;
for(int i=1;i<=n;i++){
cin>>cost[i];
cop[i]=cost[i];
}
sort(cop+1,cop+n+1);
node temp;
int tempx,tempy,blod;
for(int i=0;i<n;i++){
cin>>tempx>>tempy;
cin>>blod;
temp.to=tempy,temp.blood=blod;
G[tempx].push_back(temp);
temp.to=tempx;
G[tempy].push_back(temp);
}
int left=1,right=n,mid;
if(!dj(cop[n])){
cout<<"AFK"<<endl;
return 0;
}
mi=cop[n];
while(left<=right){
mid=(left+right)/2;
if(dj(cop[mid])){
mi=cop[mid];
right=mid-1;
} else left=mid+1;
}
cout<<mi<<endl;
return 0;
}
by kristinakawayi @ 2021-04-12 17:29:04
自己发现运算符重载方向错了,但是改过来仍然没有作用,总感觉就是优先级队列这里出了问题,我再想想
by WanderingTrader @ 2021-04-12 17:46:28
@kristinakawayi 暂时找到一个错误是dijkstra的返回应该是
return dist[n]<=b;
不是<
by kristinakawayi @ 2021-04-12 19:42:28
@wandering_trader 这个运算符重载我改过来了还是27分,呜呜呜