#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h> //hdu2544
#include <queue> //Dijkstra算法,单源最短路径(一个起点到各个点的最短距离)
#define inf 9999999
using namespace std;
int n, map[110][110], dis[110], vis[110];
void Dijkstra(int x)
{
int t, j, min, k;
memset(vis, 0 ,sizeof(vis)); //vis[t]=0表示还没有求出最短距离
for(t=1; t<=n; ++t)
{
dis[t]=map[x][t]; //dis[t]指的是从原点到t所要的距离
}
vis[x]=1; //原点先标记已求出
for(j=1; j<=n; ++j) //求n个点距离x的最短距离的循环次数(因为有n个点)
{
min=inf; //注意每次都要重新赋值
for(t=1; t<=n; ++t)
{
if(!vis[t]&&dis[t]<min)
{
k=t; //k记录(未求出的)最小距离的节点
min=dis[t];
}
}
vis[k]=1;
for(t=1; t<=n; ++t) //更新剩余的节点
{
if(!vis[t]&&dis[k]+map[k][t]<dis[t]) //dis[k](k这个节点已经求出)已是最小
dis[t]=dis[k]+map[k][t];
}
}
return ;
}
int main()
{
int t, m, j, a, b, c;
while(scanf("%d%d", &n, &m)!=EOF)
{
if(n==0&&m==0)break;
for(j=1; j<=n; ++j)
{
for(t=1; t<=n; ++t)
map[j][t]=inf; //初始化,j到t的距离
}
while(m--)
{
scanf("%d%d%d", &a, &b, &c);
map[a][b]=map[b][a]=c; //无向图
}
Dijkstra(1); //起始点
printf("%d\n", dis[n]);
}
return 0;
}
另一道类似hdu1874
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>
#include <queue> //Dijkstra算法,单源最短路径(一个起点到各个点的最短距离)
#define inf 1000000000
using namespace std;
int n, map[210][210], dis[210], vis[210];
void Dijkstra(int x, int g)
{
int t, j, min, k;
memset(vis, 0 ,sizeof(vis)); //vis[t]=0表示还没有求出最短距离
for(t=0; t<n; ++t)
{
dis[t]=map[x][t]; //dis[t]指的是从原点到t所要的距离
}
vis[x]=1; //原点先标记已求出
for(j=0; j<n; ++j) //求n个点距离x的最短距离的循环次数(因为有n个点)
{
min=inf; //注意每次都要重新赋值
for(t=0; t<n; ++t)
{
if(!vis[t]&&dis[t]<min)
{
k=t; //k记录(未求出的)最小距离的节点
min=dis[t];
}
}
vis[k]=1;
if(k==g)return ;
for(t=0; t<n; ++t) //更新剩余的节点
{
if(!vis[t]&&dis[k]+map[k][t]<dis[t]) //dis[k](k这个节点已经求出)已是最小
dis[t]=dis[k]+map[k][t];
}
}
return ;
}
int main()
{
int t, m, j, a, b, c, start, end;
while(scanf("%d%d", &n, &m)!=EOF)
{
for(j=0; j<n; ++j)
{
for(t=0; t<n; ++t)
map[j][t]=inf; //初始化,j到t的距离
}
while(m--)
{
scanf("%d%d%d", &a, &b, &c);
if(a<b) //处理重边的情况
{
map[a][b]=min(map[a][b], c);
map[b][a]=map[a][b];
}
else
{
map[b][a]=min(map[b][a], c);
map[a][b]=map[b][a];
}
}
scanf("%d%d", &start, &end);
if(start==end)
{
printf("0\n");
continue;
}
Dijkstra(start, end); //起始点
if(dis[end]!=inf)
printf("%d\n", dis[end]);
else printf("-1\n");
}
return 0;
}