【悬关】为什么 Dijkstra 不对
查看原帖
【悬关】为什么 Dijkstra 不对
502758
ForMyDream楼主2023/8/23 14:25

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;
}
2023/8/23 14:25
加载中...