#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
typedef long long ll;
using namespace std;
#define MAX 0x3f3f3f3
int mp[105][105]; //两者之间的距离
int dis[105]; //起始点到其它点的最短路程
int biaoji[105]; //标记一个点是否是旧点
int weizhi; //对到达的点进行位置标记
void Dijkstra(int m)
{
biaoji[1]=1; //将初始点标记
for (int i=1;i<=m;i++) //记录一开始初始点到各个点的距离
{
dis[i]=mp[1][i];
}
for (int i=1;i<=m;i++)
{
int minx=MAX;
for (int j=1;j<=m;j++)
{
if( dis[j]<minx && biaoji[j]==0 ) //只要还有新点便进行更新 (重要) -》 我们找的新点是(所有点中 未被标记 且 距离初始点最近 的点)
{
minx=dis[j];
weizhi=j;
}
}
if(minx==MAX) break; //如果距离初始点的距离都为MAX,也就是没有点可以更新,就break;
biaoji[weizhi]=1;
for (int j=1;j<=m;j++) //只要一个点经过标记点到初始点的距离可以更新,便更新。
{
if(biaoji[j]==0 && dis[j] > (dis[weizhi])+ mp[weizhi][j])
{
dis[j]=mp[weizhi][j] + dis[weizhi];
}
}
}
}
int main ()
{
int m,n,a,b,c;
while (cin >> m >> n) //m表示点数,n表示边数
{
if(m==0&&n==0)break;
memset(biaoji, 0, sizeof(biaoji)); //初始化
for (int i=1;i<=105;i++) //将两个点之间的距离都设为最大值
{
for (int j=1;j<=105;j++)
{
mp[i][j]=MAX;
}
}
for (int i=1;i<=n;i++) //遍历n条边,将两个端点之间的距离更新
{
cin >> a >> b >> c;
mp[a][b]=mp[b][a]=c;
}
Dijkstra(m);
cout << dis[m] << endl;
}
return 0;
}
堆优化
//Dijkstra的堆优化
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
#define N 200005
#define MAX 0x3f3f3f3f3f3f3f3f
ll head[N],cnt;
struct sss{
ll v,w,next;
}edge[N << 1];
struct node{
ll id,dis;
bool operator <(const node &a) const {
return dis > a.dis; //从小到大排序
}
};
void add_edge(ll u,ll v,ll w){
edge[++cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
ll n,m,a,b,c,weizhi;
ll vis[N]; //标记数组
ll dis[N]; //初始点 - 终点 的距离
void Dijkstra(){
dis[1] = 0;
priority_queue<node>q;
q.push(node{1,0});
while (!q.empty()) {
node o = q.top(); //用优先队列直接找出距离最短的点
q.pop();
ll weizhi = o.id;
if(vis[weizhi]==1) continue;
vis[weizhi] = 1;
for (ll i=head[weizhi] ; i!=-1 ; i=edge[i].next){ //遍历与i的每一条边
ll j = edge[i].v;
if(vis[j] == 1) continue;
if(dis[j] > dis[weizhi] + edge[i].w){
dis[j] = dis[weizhi] + edge[i].w;
q.push(node{j,dis[j]});
}
}
}
}
void init(){
memset(vis, 0, sizeof(vis));
for(int i=1;i<=n;i++)dis[i]=MAX;
// memset(dis, MAX, sizeof(dis));
memset(head, -1, sizeof(head));
cnt = 0;
for (int i=1;i<=m;i++){
cin >> a >> b >> c;
add_edge(a, b, c);
add_edge(b, a, c);
}
}
int main()
{
cin >> n >> m;
init();
Dijkstra();
if(dis[n] == MAX) cout << "qwb baka" << endl;
else cout << dis[n] << endl;
return 0;
}