为什么能过?
查看原帖
为什么能过?
1089662
MadeXiaohu楼主2024/7/31 11:00

不理解为什么能过…… 是数据太水了嘛?
代码如下:

#include<bits/stdc++.h>
using namespace std;
const int inf=INT_MAX;
int n,m,be; 
struct Edge{
	int v,w,nxt;
}edge[300500];
struct num{
	int dis,v;
	inline friend bool operator <(num x,num y){
		return x.dis>y.dis;
	}
};
int Link[105000];
int vis[105000];
int dis[105000];
int ldis[105000];
int len;
void Insert(int xx,int yy,int ww){
	edge[++len].v=yy;
	edge[len].w=ww,edge[len].nxt=Link[xx];
	Link[xx]=len;
}
void dijkstra(int be){
	for(int i=1;i<=n;i++){
		dis[i]=inf;
		ldis[i]=inf;
	}dis[be]=0;
	priority_queue<num> pq;
	pq.push((num){0,be});
	while(!pq.empty()){
		num tmp=pq.top();
		pq.pop();
//		if(vis[tmp.v]) continue;
//		vis[tmp.v]=1;
		for(int i=Link[tmp.v];i;i=edge[i].nxt){
			int yy=edge[i].v;
			if(dis[yy]>tmp.dis+edge[i].w){
			    ldis[yy]=dis[yy];
				dis[yy]=tmp.dis+edge[i].w;
//			    if(!vis[yy]){
				pq.push((num){dis[yy],yy});
//			    }
		    }else if(dis[yy]!=tmp.dis+edge[i].w&&ldis[yy]>tmp.dis+edge[i].w){
		    	ldis[yy]=tmp.dis+edge[i].w;
//		    	if(!vis[yy]){
				pq.push((num){ldis[yy],yy});
//			    }
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	int x,y,z;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		Insert(x,y,z);
		Insert(y,x,z);
	}
	dijkstra(1);
	cout<<ldis[n];
return 0;
}
2024/7/31 11:00
加载中...