HDU 2544 最短路

来源:互联网 发布:淘宝客服绩效软件 编辑:程序博客网 时间:2024/05/04 18:03

最短路裸奔。

spfa练习~

#include<stdio.h>#define INF 0x7FFFFFFF#include<queue>#include<string.h>using namespace std;int head[10005],tot;struct edge{      int st,ed,dis,next;}a[10005];              //邻接表int n,m;int dist[205];   //到某个点最短距离int in[205];     //点是否在队列中int cnt[205];    //点入队次数void add(int st,int ed,int dis){    a[tot].st=st,a[tot].ed=ed,a[tot].dis=dis;    a[tot].next=head[st];    head[st]=tot++;}int spfa(int st,int ed){    queue<int>q;    for(int i=0;i<=n;i++)dist[i]=INF;    dist[st]=0,in[st]=0;    q.push(st);    while(q.size()){        int tp=q.front(),b;        q.pop();        for(int i=head[tp];i!=-1;i=a[i].next){            b=a[i].ed;            if(dist[tp]+a[i].dis<dist[b]){                dist[b]=dist[tp]+a[i].dis;                if(in[b]==0){                    in[b]=1,q.push(b);                }                cnt[b]++;                if(cnt[b]>n)return 0;            }        }in[tp]=0;    }    return 1;}void init(){    tot=0;    int st,ed,dis;    memset(head,-1,sizeof(head));    memset(in,0,sizeof(in));    memset(cnt,0,sizeof(cnt));    for(int i=0;i<m;i++){        scanf("%d %d %d",&st,&ed,&dis);        add(st,ed,dis),add(ed,st,dis);    }}int main(){    while(scanf("%d %d",&n,&m)!=EOF){        if(n==0&&m==0)break;        init();        spfa(1,n);        if(dist[n]!=INF)        printf("%d\n",dist[n]);    }    return 0;}


原创粉丝点击