Dijkstra算法模板题,用链式前向星存图.
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年09月06日 星期四 15时09分09秒
> Description:HDU1874,dijkstra
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 200
struct node
{
long long to;
long long val;
long long nex;
}E[200*199];
long long head[N];
long long dis[N];
bool vis[N];
long long s,e,cnt;
long long n,m;
void addEdge(long long a, long long b, long long val)
{
E[cnt].val=val;
E[cnt].to=b;
E[cnt].nex=head[a];
head[a]=cnt++;
E[cnt].val=val;
E[cnt].to=a;
E[cnt].nex=head[b];
head[b]=cnt++;
}
void init()
{
memset(head,-1,sizeof(head));
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,false,sizeof(vis));
cnt=0;
for (long long i=0; i<m; i++)
{
long long a,b,val;
scanf("%lld%lld%lld",&a,&b,&val);
addEdge(a,b,val);
}
scanf("%lld%lld",&s,&e);
vis[s]=true;
long long k=head[s];
while(k != -1)
{
if (dis[E[k].to]>E[k].val)
dis[E[k].to]=E[k].val;
k=E[k].nex;
}
dis[s]=0;
}
void dijkstra()
{
for (long long i=0; i<n-1; i++)
{
long long minn=111111;
long long tmp;
for (long long j=0; j<n; j++)
{
if (!vis[j]&&dis[j]<minn)
{
minn=dis[j];
tmp=j;
}
}
vis[tmp]=true;
long long k=head[tmp];
while (k != -1)
{
if (!vis[E[k].to]&&(dis[E[k].to]>(dis[tmp]+E[k].val)))
dis[E[k].to]=dis[tmp]+E[k].val;
k=E[k].nex;
}
}
if (dis[e]>10000)
dis[e]=-1;
printf("%lld\n",dis[e]);
}
int main()
{
while (~scanf("%lld%lld",&n,&m))
{
init();
dijkstra();
}
return 0;
}