如果N过大邻接矩阵可能会爆
//o(n*n)且无法解决负权边
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int dist[N];//每个点到起点的距离
int g[N][N];//邻接矩阵
int n,m;
bool st[N];//存储已经确定的最短路径的点,也就是访问过了的
int dijkstra()
{
//初始化每个点到起点的距离为无穷
memset(dist,0x3f3f3f3f,sizeof(dist));
//1是起点
dist[0]=0;
//循环n次由此确定n个点到起点的最短距离
for(int i=0;i<n;i++)
{
//每次用t来存没有确定最短距离且距离起点最近的点
int t=-1;
for(int j=0;j<n;j++)
{
if(!st[j]&&(t==-1||dist[j]<dist[t]))
t=j;
}
st[t]=true;
//用这个点更新和他相连的点距离起点的距离
for(int j=0;j<n;j++)
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
//如果n距离起点无穷,说明没有路径到达
if(dist[n-1]==0x3f3f3f3f)return -1;
return dist[n-1];
}
int main()
{
cin>>n>>m;
memset(g,0x3f,sizeof(g));
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
//防止重边
g[a][b]=min(g[a][b],c);
g[b][a]=g[a][b];
}
int t=dijkstra();
cout<<t<<endl;
for(int i=0;i<n;i++)
{
cout<<dist[i]<<endl;
}
return 0;
}