1381:城市路(Dijkstra)

#include<bits/stdc++.h>
using namespace std;
struct Edge
{
	int next;                               //下一条边的编号 
	int to;                                 //这条边到达的点 
	int dis;                                //这条边的长度 
}edge[20020];

int head[2020];	//顶点的某一条边
int num_edge;	//边的编号
void add_edge(int from,int to,int dis)      //加入一条从from到to距离为dis的单向边 
{
	++num_edge;
	edge[num_edge].next=head[from];
	edge[num_edge].to=to;
	edge[num_edge].dis=dis;
	head[from]=num_edge;
}

int n,m,dis[2020];
bool v[2020];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,l;
		cin>>u>>v>>l;
		add_edge(u,v,l);
		add_edge(v,u,l);	
	}
	for(int i=1;i<=n;i++){
		dis[i]=0x7fffffff;
	}
	dis[1]=0;
	
	for(int i=1;i<n;i++){
		int minn=0x7fffffff;
		int u;
		for(int i=1;i<=n;i++){
			if(!v[i]&&dis[i]<minn){
				minn=dis[i];
				u=i;
			}
		}
		v[u]=true;
		
		for(int i = head[u]; i ; i= edge[i].next ){
			dis[edge[i].to] = min(dis[edge[i].to], dis[u] + edge[i].dis);
		}
	}

	
	
	if(dis[n]==0x7fffffff){
		cout<<-1;
	}else{
		cout<<dis[n];
	}
	
}
posted @ 2022-10-07 20:21  I'm_江河湖海  阅读(5)  评论(0编辑  收藏  举报