最短路水题,由于是求1到n的最短路,即单源多点最短路,所以用Dijkstra
直接好懒。。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=110;
const int maxt=99999;
int dis[maxn];
int map[maxn][maxn];
int n;
void Dijkstra(int start)
{
int i,j,p,x;
bool s[maxn];
for(i=1;i<=n;i++)
{
dis[i]=map[start][i];//先取 到头结点的几个
s[i]=false;
}
dis[start]=0;
s[start]=true;
for(i=1;i<=n;i++)
{
p=maxt;
for(j=1;j<=n;j++)
{
if(!s[j]&&dis[j]<p)
{
x=j; //记录
p=dis[j]; //取最小
}
}
s[x]=true; //x为到i的最小
for(j=1;j<=n;j++) //更新dis
{
if(!s[j]&&dis[x]+map[x][j]<dis[j])
dis[j]=dis[x]+map[x][j];
}
}
}int main()
{
int i,m,j,k,start,end,len;
while((scanf("%d%d",&n,&m))!=EOF)
{
if(n==0&&m==0)break;
for(i=0; i<=n; ++i)
for(j=0; j<=n; ++j)
map[i][j] = maxt;
for(k=0;k<m;k++) //从零开始
{
cin>>i>>j; cin>>len; //邻接矩阵
if(len<map[i][j])
{
map[i][j]=len;
map[j][i]=map[i][j];
}
}
start=1;
for(i=1;i<=n;i++)
{
dis[i]=maxt; //先设为无限远
}
Dijkstra(start);
end=n;
cout<<dis[end]<<endl;
}
return 0;
}