/*
1 这一题的程序根图有一点不一样。图中的顶点全部都+1就可以了
*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 103
//#define MAX 8
#define INF 1000002
int map[MAX][MAX];//从i到j的距离
int visited[MAX];
int cost[MAX];//这个是计算出来的最短路径
int point,road;
int min(int a,int b)
{
if(a>b)
return b;
return a;
}
void init()
{
int i,j;
for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++)
{
map[i][j]=INF;
}
visited[i]=0;
cost[i]=INF;
}
}
int noroad()//从已经访问过的集合当中找,下一步可以方位的点。
{
int i=1;int j=1;
for(i=1;i<=point;i++)//选中第i点(i是以访问过的点集合)
{
if(visited[i]==1)
{
for(j=1;j<=point;j++)
{
if(visited[j]==0&&map[i][j]!=INF)//map[j]!=0表示有通路,visited[j]表示j没有访问过。
return 0;
}
}
}
return 1;
}
void dij()
{
visited[1]=1;cost[1]=0;
while(!noroad())
{
int i=1,j=1;int tmin=INF;int tj;
for(i=1;i<=point;i++)//选中第i个顶定
{
if(visited[i]==1)
{
for(j=1;j<=point;j++)//第i个点到j个点
{
if(map[i][j]!=INF&&visited[j]==0)
{
if(tmin>cost[i]+map[i][j])
{
tmin=cost[i]+map[i][j];
tj=j;
}
}
}
}
}//for
visited[tj]=1;
cost[tj]=tmin;
//更新路径
//如果加入tj这个点以后,从vo到T中的点的距离变短了,那么修改
for(i=1;i<=point;i++)
{
if(visited[i]==0)
{
cost[i]=min(cost[i],cost[tj]+map[tj][i]);
}
}
}//while
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d %d",&point,&road))
{
//初始化
init();
//输入
if(point==0&&road==0)
return 0;
int i=0;
for(i=0;i<road;i++)
{
int a,b,c;scanf("%d %d %d",&a,&b,&c);
map[a][b]=c;
map[b][a]=c;
}
//处理
dij();
/*
//输出
for(i=1;i<=point;i++)
{
cout<<cost[i]<<endl;
}
cout<<endl;
cout<<endl;
*/
cout<<cost[point]<<endl;
}
return 0;
}
/*
输入
6 8
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 6 60
5 4 20
5 6
1 3 2
1 4 2
3 4 3
1 5 12
4 2 34
5 2 24
0
输出0
1000002
10
50
30
60
0
36
2
2
12
*/
(精)hdoj 2544(最短路,地杰斯特拉算法)(无向图)
最新推荐文章于 2021-05-23 12:20:04 发布