zoukankan      html  css  js  c++  java
  • UVa-10986_Sending email (向前星+Dijkstra)

    题意:给你点、边,求起点到终点的最短距离。
    题解:由于题目的数据量特别大,所以需要用邻接表来存边,之后对Dijkstra算法稍微魔改一下就可以了,本来以为会超时,做好了打堆优化的准备,结果卡时间过了,可以说很开心了.
    注意SPFA会超时。

    #include <queue>
    #include <cmath>
    #include <stack>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int maxn = 20050;
    const int INF = 1e9 + 7;
    
    struct node
    {
        int next,to,w;
    }s[50050*2];
    
    int head[maxn],f[maxn],dis[maxn],num,n,m,S,T;
    
    void add(int u,int v,int w)
    {
        s[num].to = v;
        s[num].next = head[u];
        s[num].w = w;
        head[u] = num++;
    }
    
    void SPFA()
    {
        int i,j,MIN,k,u;
        for(i=0;i<n;i++)
        {
            dis[i] = INF;
            f[i] = 0;
        }
        for(i=head[S];i!=-1;i=s[i].next)
        {
            u = s[i].to;
            dis[u] = s[i].w;
        }
        f[S] = 1;
        for(i=0;i<n;i++)
        {
            MIN = INF;
            k = -1;
            for(j=0;j<n;j++)
            {
                if(!f[j]&&dis[j]<MIN)
                {
                    MIN = dis[j];
                    k = j;
                }
            }
            if(MIN==INF)
                break;
            f[k] = 1;
            for(j=head[k];j!=-1;j=s[j].next)
            {
                u = s[j].to;
                if(!f[u]&&dis[k]+s[j].w<dis[u])
                    dis[u] = dis[k] + s[j].w;
            }
        }
        if(dis[T]!=INF)
            printf("%d
    ",dis[T]);
        else
            printf("unreachable
    ");
    }
    
    int main()
    {
        int t,i,a,b,c,k = 1;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d%d",&n,&m,&S,&T);
            for(i=0;i<n;i++)
                head[i] = -1;
            num = 0;
            for(i=0;i<m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);
                add(b,a,c);
            }
            printf("Case #%d: ",k++);
            SPFA();
        }
        return 0;
    }
    
  • 相关阅读:
    Python基础知识之4——三大控制结构
    Python基础知识之3——运算符与表达式
    Python基础知识之2——字典
    常用的数据分析方法汇总
    关于Windows10企业版的激活方法
    插补法图像压缩
    MouseHover-鼠标停留伴随内容提示
    移动端viewport模版
    Ajax的跨域请求
    Json用途
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/9757858.html
Copyright © 2011-2022 走看看