• 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;
    }
  • 相关阅读:
    js中父窗口获得模态窗口的返回值
    Jquery获取控件值实例(转载)
    各种类库网址学习
    IIS启动网站时, 提示: “另一个程序正在使用此文件,进程无法访问”
    查看端口占用情况
    顽固的换行问题
    mac上共享android手机屏幕软件
    关于软键盘弹出的问题
    mac搭建android studio开发环境
    C语言位域和大小端
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934482.html
Copyright © 2020-2023  润新知