HDU-2544

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 80836    Accepted Submission(s): 34999

Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

 


Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
 


Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 


Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
 


Sample Output
3 2
最短路,我用了SPFA算法写的,结合了某位大佬年轻时的代码(真的很“年轻”队列用数组写的)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<stdlib.h>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<ctype.h>
#define zuida 100000
using namespace std;
#define INF 1e9
#define max 100005
struct node
{
    int to;
    int val;
    int next;
}bian[max];
int head[max],vis[max];
int n,m;
int tto=0;
void add(int a,int b,int c)
{
    bian[tto].to=b;
    bian[tto].val=c;
    bian[tto].next=head[a];
    head[a]=tto++;
}
int dis[max];
int que[max];
queue<int> qq;
void spfa(int start,int num)
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=num;i++)
        dis[i]=INF;
    //int front=-1,tail=-1;
    //dis[start]=0;vis[start]=1;que[++tail]=start;
    qq.push(start);dis[start]=0;vis[start]=1;

    int top,to;
    int temp;
    /*while(front!=tail)
    {
        if(++front==n)front-=num;
        top=que[front];vis[top]=0;
        for(int p=head[top];p!=-1;p=bian[p].next)
        {
            to=bian[p].to;
            temp=dis[top]+bian[p].val;
            if(dis[to]>temp)
            {
                dis[to]=temp;
                if(!vis[to])
                {
                    if(++tail>num)tail-=num;
                    que[tail]=to;
                    vis[to]=1;
                }
            }
        }
    }
    */
    while(!qq.empty())
    {
        top=qq.front();qq.pop();vis[top]=0;
        for(int p=head[top];p!=-1;p=bian[p].next)
        {
            to=bian[p].to;
            temp=dis[top]+bian[p].val;
            if(dis[to]>temp)
            {
                dis[to]=temp;
                if(!vis[to])
                {
                   qq.push(to);
                    vis[to]=1;
                }
            }
        }
    }
}

int main()
{
    int b,w,m,k;
    while(cin>>n>>m&&n&&m)
    {
        int maxx=-100000;
        memset(head,-1,sizeof(head));
        for(int i=1;i<=m;i++)
        {
            cin>>k>>b>>w;
            if(k>maxx)maxx=k;
            if(b>maxx)maxx=b;
            add(k,b,w);
            add(b,k,w);
        }
        spfa(1,maxx);
        cout<<dis[n]<<endl;
    }
    return  0;
}

 

posted @ 2018-04-18 19:59  翛宁  阅读(72)  评论(0编辑  收藏  举报