#include <iostream>
#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#define esp 1e-6
#define inf 0x0f0f0f0f
#define LL long long
using namespace std;
/************************************************
Desiner:hl
time:2015/11/10
Exe.Time:15MS
Exe.Memory:1632K
用kuangbin大神的SPFA模板过的,用于熟悉模板和构图
************************************************/
const int MAXN=1111;
const int MAXE=111111;//这个5000会RE
const int INF=0x3f3f3f3f;
int head[MAXN];
int dist[MAXN];
int cnt[MAXN];
int que[MAXN];
bool vis[MAXN];
struct edge
{
int to;
int next;
int v;
}edge[MAXE];
int tol;
void init(){
tol=0;
memset(head,-1,sizeof(head));
}
void add(int a,int b,int c)
{
edge[tol].to=b;
edge[tol].v=c;
edge[tol].next=head[a];
head[a]=tol++;
}
bool SPFA(int start,int n)
{
int front=0,rear=0;
for(int v=1;v<=n;v++)
{
if(v==start)
{
dist[v]=0;
que[rear++]=v;
vis[v]=true;
cnt[v]=1;
}
else
{
dist[v]=INF;
vis[v]=false;
cnt[v]=0;
}
}
while(front!=rear)
{
int u=que[front++];
vis[u]=false;
if(front>=MAXN)front=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(dist[v]>dist[u]+edge[i].v)
{
dist[v]=dist[u]+edge[i].v;
if(!vis[v])
{
vis[v]=true;
que[rear++]=v;
if(rear>=MAXN)rear=0;
if(++cnt[v]>n)return true;
}
}
}
}
return false;
}
int main(){
int i,j,k,l,m,n,a,b,w;
while(~scanf("%d%d",&m,&n)&&m+n){
init();
for(i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
add(b,a,w);
}
SPFA(1,m);
printf("%d\n",dist[m]);
}
}
HDU 2544 最短路
最新推荐文章于 2019-05-31 01:13:11 发布