图论!
2023-07-17 08:58:04
发布于:上海
46阅读
0回复
0点赞
这题有负环,所以要用dijkstra(个人叫它迪结哥斯拉)

先是可爱的链式前向星(存图,比派蒙还可爱)
int vtx[N],head[N],ntx[N],w[N],idx;
void add(int a,int b,int c){
	ntx[idx]=head[a];
	head[a]=idx;
	vtx[idx]=b;
	w[idx]=c;
	idx++;
} 
然后就是可爱的核心代码(和纳西妲一样可爱)
void dijkstra(int x){
	memset(visited,0,sizeof(visited));
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;
	q.push({dis[1],1});
	while(q.size()){
		Node tt=q.top();
		q.pop();
		int k=tt.v;
		if(visited[k]){
			continue;
		}
		visited[k]=true;
		for(int i=head[k];i!=-1;i=ntx[i]){
			int j=vtx[i];
			if(cnt[j]>x){
				continue;
			}
			if(dis[j]>dis[k]+w[i]){
				dis[j]=dis[k]+w[i];
				q.push({dis[j],j});
			}
		}
	}
}
然后附上超级可爱全代码(离可莉的可爱程度只差一点,不要直接抄,再看看有哪里错了)
#include<bits/stdc++.h>
using namespace std;
const int N=10e6+5;
int dis[N];
int vtx[N],head[N],ntx[N],w[N],idx;
bool visited[N];
struct Node{
	int dis;
	int v;
	bool operator <(const Node &b) const{
		return  dis>b.dis;
	}
};
void add(int a,int b,int c){
	ntx[idx]=head[a];
	head[a]=idx;
	vtx[idx]=b;
	w[idx]=c;
	idx++;
} 
int n,m,b,cnt[N];
priority_queue<Node> q;
void dijkstra(int x){
	memset(visited,0,sizeof(visited));
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;
	q.push({dis[1],1});
	while(q.size()){
		Node tt=q.top();
		q.pop();
		int k=tt.v;
		if(visited[k]){
			continue;
		}
		visited[k]=true;
		for(int i=head[k];i!=-1;i=ntx[i]){
			int j=vtx[i];
			if(cnt[j]>x){
				continue;
			}
			if(dis[j]>dis[k]+w[i]){
				dis[j]=dis[k]+w[i];
				q.push({dis[j],j});
			}
		}
	}
}
int main(){
	cin>>n>>m>>b;
	memset(head,-1,sizeof(head));
	int l=1e9,r=0;
	for(int i=1;i<=n;i++){
		cin>>cnt[i];
		r=max(cnt[i],r);
	}
	l=max(cnt[1],cnt[n]);
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	while(l<r){
		int mid=(l+r)/2;
		dijkstra(mid);
		if(dis[n]>b){
			l=1+mid;
		}else{
			r=mid;
		}
	}
	dijkstra(l);
	if(dis[n]>b){
		cout<<"你干嘛哈嗨哟"<<endl;
	}else{
		cout<<n<<endl;
	}
	return 0;
}
这里空空如也

有帮助,赞一个