• HDU 2544 最短路 SPFA 邻接表 模板


    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&lt;=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 代码:
    <pre name="code" class="cpp">#include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxx 99999999
    #include<queue>
    using namespace std;
    struct node{
       int to,w;
       int pre;  //表示 同一起点的前一条边
    }edge[20005];
    int vis[505],dis[505];
    int next[20005];
    int m,n;
    int tot;
    void addedge(int u,int v,int w)
    {
        int j,t=0;
        for(j=next[u];j!=-1;j=edge[j].pre)   //去重边
        {
            if(v==edge[j].to&&w>=edge[j].w)
            {
                t=1;
                break;
            }
        }
        if(t==1)
            return;
        edge[tot].to=v;
        edge[tot].w=w;
        edge[tot].pre=next[u];//  邻接表的存储
        next[u]=tot++;       //
        edge[tot].to=u;  //构造反向边
        edge[tot].w=w;
        edge[tot].pre=next[v];
        next[v]=tot++;
        return;
    }
    int spfa()
    {
        queue<int>q;
        int now;
        for(int i=1;i<=m;i++)
        {
            vis[i]=0;
            dis[i]=maxx;
        }
        dis[1]=0;
        vis[1]=1;
        q.push(1);
        while(!q.empty())
        {
            now=q.front();
            q.pop();
            vis[now]=0;        //反向边
            for(int i=next[now];i!=-1;i=edge[i].pre)  //遍历同一起点的全部边(从最后一条边開始)
            {
                int v=edge[i].to;
                if(dis[v]>dis[now]+edge[i].w)
                {
                    dis[v]=dis[now]+edge[i].w;
                    if(!vis[v])
                    {
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
        return dis[m];
    }
    int main()
    {
        while(~scanf("%d%d",&m,&n))
        {
            if(m==0&&n==0)
            break;
            tot=1;
            memset(next,-1,sizeof(next));
            while(n--)
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                addedge(a,b,c);
            }
            int s=spfa();
            cout<<s<<endl;
        }
        return 0;
    }
    



    
    
  • 相关阅读:
    linux安装python串口工具pyserial遇到不能成功导入的问题
    yum rpm apt-get wget 辨析
    系统时间不一致导致memcached的session不共享
    ERROR: transport error 202: bind failed: Address already in use
    The user specified as a definer ('root'@'%') does not exist
    IE比Chrome强的一个地方
    电脑突然死机,系统日志记录事件ID=6008
    mysql 查询多个id
    tomcat登陆WEB显示无权限问题&& tomcat无限循环启动问题
    MySql中把一个表的数据插入到另一个表中的实现代码
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4094063.html
Copyright © 2020-2023  润新知