zoukankan      html  css  js  c++  java
  • hdoj3790 【最短路】

    这一题啊,其实还是很简单的~(A掉了就很简单啊~)
    思路:
    松弛,然后在里面维护一个小最短路~;
    A掉这一题,感觉松弛的理解又上了一个台阶,以及spfa的原理,最短路用到的原理就是松弛,先把图构造到最优,然后输出一下就好了~
    还是最喜欢国产spfa!!强大,无敌!!!
    所以还是在spfa上搞搞~~
    【现在再看博客时,曾今那个天真的自己。。。qaq,巨巨莫怪】

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    #define LL long long
    #define INF 0x3f3f3f3f
    const double pi = acos(-1.0);
    
    const int mod =9973;
    
    const int N = 1010;
    
    struct asd{
        int to;
        int w;
        int m;
        int next;
    };
    bool vis[N];
    int dis[N];
    int used[N];
    asd q[N*N];
    int tol,head[N*N];
    int cash[N][N];
    int n;
    
    queue<int>e;
    void super_spfa(int s,int t)
    {
        while(!e.empty())
            e.pop();
        for(int i=1;i<=n;i++)
        {
            if(i!=s)
            {
                vis[i]=0;
                dis[i]=INF;
                used[i]=cash[s][i];
            }
        }
    //  printf("%d
    ",used[3]);
        used[s]=0;
        vis[s]=1;
        dis[s]=0;
        e.push(s);
    
        while(!e.empty())
        {
            int u=e.front();e.pop();
            vis[u]=0;
            for(int v=head[u];v!=-1;v=q[v].next)
            {
                int i=q[v].to;
            //  printf("i=%d
    ",i);
                if(dis[i]>dis[u]+q[v].w)
                {
                    dis[i]=dis[u]+q[v].w;
                    used[i]=used[u]+q[v].m;
                    if(!vis[i])
                    {
                        vis[i]=1;
                        e.push(i);
                    }
                    //printf("i=%d  %d
    ",i,used[i]);
                }
                else if(dis[i]==dis[u]+q[v].w)
                {
                    if(used[i]>used[u]+q[v].m)
                    {
                        used[i]=used[u]+q[v].m;
                    //  printf("i=%d  %d
    ",used[i]);
                        if(!vis[i])
                        {
                            vis[i]=1;
                            e.push(i);
                        }
                    }
                }
            }
        }
        printf("%d %d
    ",dis[t],used[t]);
    }
    
    void add(int a,int b,int c,int d)
    {
        q[tol].to=b;
        q[tol].w=c;
        q[tol].m=d;
        q[tol].next=head[a];
        head[a]=tol++;
    }
    
    int main()
    {
        int m;
        int a,b,c,d,s,t;
        while(~scanf("%d%d",&n,&m)&&n&&m)
        {
            tol=0;
            memset(head,-1,sizeof(head));
            for(int i=0;i<m;i++)
            {
                scanf("%d%d%d%d",&a,&b,&c,&d);
                add(a,b,c,d);
                add(b,a,c,d);
                cash[a][b]=cash[b][a]=d;
            }
            scanf("%d%d",&s,&t);
            super_spfa(s,t);
        }
        return 0;
    }
  • 相关阅读:
    SpringBoot 项目发现的错误
    maven项目SpringBoot框架
    eclipse不能正常启动
    @Service、@Controller、@Repository、@Resource注解的作用
    navicat 不能正常启动
    序列化和反序列化
    hibernate主键生成策略
    eclipse 安装注意事项之一
    js-cookie的使用说明
    微信小程序自定义顶部导航栏,添加背景图,透明色等
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934482.html
Copyright © 2011-2022 走看看