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;
    }
  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934482.html
Copyright © 2011-2022 走看看