HDU 2544 最短路

来源:互联网 发布:simulink一端口多输入 编辑:程序博客网 时间:2024/05/20 14:44
#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:hltime:2015/11/10Exe.Time:15MSExe.Memory:1632K用kuangbin大神的SPFA模板过的,用于熟悉模板和构图 ************************************************/const int MAXN=1111;const int MAXE=111111;//这个5000会REconst 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]);}}

0 0