最短路问题(边权不含负数)例题
###来自计蒜客的一个题目QAQ
题目链接
学名叫做:dijkstra算法
目的:做笔记,方便以后看。。。
从一个叫《程序员小灰》的微信公众号上学到的
算法不难,但是算法的证明比较烧脑子。
#include<iostream>
#include<cstring>
#define INF 0x3f3f3f3f //小菜鸡刚刚才知道这个叫无穷大
using namespace std;
int main(void)
{
bool flag[105];
int n,m,a,b,c,map[105][105],ans[105];
while (cin>>n>>m)
{
int num=0,min=INF,u=-1;
memset(flag,0,sizeof(flag));
memset(ans,INF,sizeof(ans));
ans[1]=0;
memset(map,-1,sizeof(map));
if (n==0&&m==0)
break;
for (int i=0;i<m;i++)
{
cin>>a>>b>>c;
map[a][b]=c;
map[b][a]=c;
} //构建邻接矩阵;
while (1)
{
u=-1;
for (int i=1;i<=n;i++)
{
if (!flag[i])
{
if (min>ans[i])
{
u=i;
min=ans[i];
}
}
} //从距离表中找到最小元素;
flag[u]=1;
if (u==-1)
break;
for (int i=1;i<=n;i++)
{
if (map[u][i]!=-1)
if (map[u][i]+ans[u]<ans[i])
ans[i]=map[u][i]+ans[u];
}
min=INF;
}
cout<<ans[n]<<endl;
}
return 0;
}