rt,用双端队列广搜能 AC,用 Dijkstra 就不行,求解答,谢谢。
#include<iostream>
#include<cstring>
#include<queue>
#include<deque>
#define maxn 1001
using namespace std;
int n,k,m,cnt,head[maxn],dis[maxn];
bool vis[maxn];
struct Edge{ int v,w,w2,nxt; }edge[20001]; // w2:二分时与 x 比较后赋的等效边权
void add(int u,int v,int w){ edge[++cnt].v=v,edge[cnt].w=w,edge[cnt].nxt=head[u],head[u]=cnt; }
void Dijkstra(int bound){
// priority_queue <pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
priority_queue <pair<int,int> > q;
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
dis[1]=0,q.push(make_pair(0,1));
while (!q.empty()){
int u=q.top().second; q.pop();
// cout<<"出队:"<<u<<' ';
if (vis[u]) continue;
vis[u]=true;
for (int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v,w=(edge[i].w>bound);
if (dis[v]>dis[u]+w && !vis[v]){ // // >mid -> 1 反之为 0
// cout<<"入队:"<<v<<' ';
dis[v]=dis[u]+w,q.push(make_pair(dis[v],v));
}
}
}
// cout<<endl;
}
void bfs(int bound){
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
deque <int> q;
dis[1]=0,q.push_front(1);
while (!q.empty()){
int u=q.front(); q.pop_front();
if (vis[u]) continue;
vis[u]=true;
for (int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v,w=(edge[i].w>bound);
if (dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if (!w) q.push_front(v);
else q.push_back(v);
}
}
}
}
void binary_search(){
int l=0,r=1e6+1,mid;
while (l<r){
mid=l+r>>1;
// cout<<l<<' '<<r<<' '<<mid<<endl;
Dijkstra(mid);
// bfs(mid);
// for (int i=1;i<=n;i++) cout<<dis[i]<<' ';
// cout<<endl;
// cout<<dis[n]<<endl;
if (dis[n]<=k) r=mid;
else l=mid+1;
}
if (r==1e6+1) cout<<-1<<endl;
else cout<<r;
}
int main(){
cin>>n>>m>>k;
for (int i=1;i<=m;i++){
int u,v,w; cin>>u>>v>>w;
add(u,v,w),add(v,u,w);
}
binary_search();
return 0;
}