最短路算法:SPFA
#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
#define M 200002 //边
#define N 20002 //点
#define INF 1e9 //无穷大
int dis[M];
bool in_queue[M];
queue<int>Q;
int p[M],T,n,m;
struct edge
{
int en,next,len;
}E[M];
void add(int st,int en,int len)
{
E[T].en=en;
E[T].len=len;
E[T].next=p[st];
p[st]=T++;
}
void init()
{
memset(p,-1,sizeof(p));
T=0;
while(Q.size()) Q.pop();
}
int spfa(int st,int en)
{
int i,start,w;
for(i=1;i<=n;i++)
{
dis[i]=INF;
in_queue[i]=false;
}
dis[st]=0;
in_queue[st]=true;
Q.push(st);
while(!Q.empty())
{
start=Q.front();
Q.pop();
in_queue[start]=false;
for(i=p[start];i!=-1;i=E[i].next)
{
w=E[i].en;
if(dis[w]>dis[start]+E[i].len)
{
dis[w]=dis[start]+E[i].len;
if(!in_queue[w])
{
Q.push(w);
in_queue[w]=true;
}
}
}
}
return dis[en];
//for(i=2;i<=en;i++)
//printf("%d\n",dis[i]);
}
int main()
{
int st,en,len;
while(scanf("%d %d",&n,&m)!=EOF)
{
init();
while(m--)
{
scanf("%d%d%d",&st,&en,&len);
add(st,en,len);
//add(en,st,len);//双向图
}
//spfa(1,n);
printf("%d\n",spfa(1,n));
}
return 0;
}