#include <iostream>//dijistra基本运用 using namespace std; long long A[1005][1005]; long long dis[1005]; long long vis[1005]; #define MAX_ 0x3f3f3f3f; #define ll long long int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){//初始话全部顶点之间不联通 for(int j=1;j<=m;j++){ A[i][j]=MAX_; } } for(int i=0;i<n;i++){//输入连通点边权 ll a,b,c; cin>>a>>b>>c; if(A[a][b]>c){//重边问题(若两个连通点有多条双向边则两点之间的长度等于最小的那条边) A[a][b]=c; A[b][a]=c; } } for(int i=1;i<=m;i++){//赋予源点相邻点边权 dis[i]=A[m][i]; } vis[m]=1;//标记源点 for(int i=1;i<=m;i++){ long long d,min_=MAX_; for(int j=1;j<=m;j++){//查找现已知最小边权及对应点 if(!vis[j]&&dis[j]<min_){ min_=dis[j]; d=j; } } vis[d]=1;//标记此d点 for(int j=1;j<=m;j++){//根据现有最小边权更新源点到各节点最短路径 if(!vis[j]&&(dis[d]+A[d][j])<dis[j]){ dis[j]=dis[d]+A[d][j];//若存在以d点位中间点所形成路径小于原路径的节点更新此节点到源点的最小路径 } } } cout<<dis[1]<<endl; } 题目出处