80分求调
查看原帖
80分求调
993877
chuan_wat楼主2024/8/15 17:20

向大佬求助, #7#8 WA T-T

#include<bits/stdc++.h>
using namespace std;
int const N=2505;
int const M=2e5+5;
int const INF=0x3f3f3f3f;
int n,m,s,x1,x2,x3;
int W[N][N];
//链式前向星 
int tot,w[M],to[M],ne[M],cnt[N];
void add(int x1,int x2,int x3){
	to[++tot]=x2,w[tot]=x3,ne[tot]=cnt[x1],cnt[x1]=tot;
}
bool v[N];
int ans[N];
priority_queue< pair<int,int> > q;
//dijkstra 
void dij(int x){
	memset(ans,0x3f3f,sizeof(ans));
	memset(v,0,sizeof(v));
	ans[x]=0,v[x]=0;
	q.push(make_pair(0,x));
	while(q.size()){
		int p=q.top().second;q.pop();
		if(v[p]) continue;
		v[p]=1;
		for(int i=cnt[p];i;i=ne[i]){
			int y=to[i],z=w[i];
			if(ans[y]>ans[p]+z){
				ans[y]=ans[p]+z;
				q.push(make_pair(-ans[y],y));
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) W[i][j]=INF;
	}
	while(m--){
		scanf("%d%d%d",&x1,&x2,&x3);
		W[x1][x2]=min(W[x1][x2],x3);
		W[x2][x1]=min(W[x2][x1],x3);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(W[i][j]!=INF) add(i,j,W[i][j]);
		}
	}
	dij(1);
	cout<<ans[n];
	return 0;
}
2024/8/15 17:20
加载中...