P1396 dijkstra堆优化70分求调
  • 板块P1396 营救
  • 楼主mbzdf
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/17 20:33
  • 上次更新2023/11/2 13:12:22
查看原帖
P1396 dijkstra堆优化70分求调
936578
mbzdf楼主2023/10/17 20:33
#include<iostream>
#include<cstdio>
using namespace std;
void read(int &x){
	char v=getchar();x=0;
	while(v<'0'||v>'9')v=getchar();
	while(v>='0'&&v<='9')x=(x<<3)+(x<<1)+(v&15),v=getchar();
}
void write(int x){
	if(x<10)putchar(x|48);
	else write(x/10),putchar((x%10)|48);
}
int n,m;
int s[100005];
bool u[100005];
int d[100005];
struct hope{
	int i,v;
	hope *next=NULL;
}*head[100005];
int g[100005];
int _topg;
void add(int x){
	g[++_topg]=x;
	int i=_topg;
	while(i>1&&d[g[i]]<d[g[i>>1]])
		swap(g[i],g[i>>1]),i>>=1;
}
int pop(){
	if(_topg<=0)return -1;
	int vvv=g[1];
	g[1]=g[_topg--];
	int i=1;
	while(i<<1<=n){
		int son=i<<1;
		if(son+1<=_topg&&d[g[son+1]]<d[g[son]])++son;
		if(d[g[i]]<=d[g[son]])break;
		swap(g[i],g[son]);
		i=son;
	}
	return vvv;
}
void dijkstra(int st){
	for(int i=1;i<=n;++i)d[i]=0x3fffffff;
	for(int i=1;i<=n;++i)u[i]=0;
	d[st]=0,u[st]=1;
	add(st);
	int x;
	while((x=pop())!=-1){
		for(hope *p=head[x];p!=NULL;p=p->next){
			int y=p->i;
			if(d[y]>max(d[x],p->v)){
				d[y]=max(d[x],p->v);
				if(!u[y])add(y),u[y]=1;
			}
		}
	}
}
int main(){
	int s,t;
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;++i){
		int x,y,z;
		read(x),read(y),read(z);
		hope *p;
		p=new hope();
		p->i=y,p->v=z;
		p->next=head[x];
		head[x]=p;
		p=new hope();
		p->i=x,p->v=z;
		p->next=head[y];
		head[y]=p;
	}
	dijkstra(s);
	cout<<d[t];
}```
2023/10/17 20:33
加载中...