zoukankan      html  css  js  c++  java
  • P3720 [AHOI2017初中组]guide


    常规最短路,和USACO重题

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a,b,c,d,ne,head[501000],head2[501000],vis[501000],dis[501000];
    struct node{int nxt,to,from,d1,d2;}eg[501000];
    struct nd{int nxt,to,dis;}eg2[501000];
    void adde(int u,int v,int v1,int v2)
    {
        eg[++ne].d1=v1;eg[ne].d2=v2;eg[ne].from=u;eg[ne].to=v;eg[ne].nxt=head[u];
        head[u]=ne;eg2[ne].nxt=head2[v];eg2[ne].to=u;
        head2[v]=ne;
    }
    void spfa(int sart)
    {
        queue<int>q;
        memset(dis,0x3f,sizeof(dis));
        dis[sart]=0;
        vis[sart]=1;
        q.push(sart);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i;i=eg[i].nxt)
            {
                int v=eg[i].to;
                if(dis[v]>dis[u]+eg[i].d1){
                    dis[v]=dis[u]+eg[i].d1;
                    if(!vis[v]){vis[v]=1;q.push(v);}
                }
            }
        }
        for(int i=1;i<=m;i++)
        if(dis[eg[i].to]!=dis[eg[i].from]+eg[i].d1)eg2[i].dis++;
        memset(dis,0x3f,sizeof(dis));
        dis[sart]=0;
        vis[sart]=1;
        q.push(sart);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i;i=eg[i].nxt)
            {
                int v=eg[i].to;
                if(dis[v]>dis[u]+eg[i].d2){
                    dis[v]=dis[u]+eg[i].d2;
                    if(!vis[v]){vis[v]=1;q.push(v);}
                }
            }
        }
        for(int i=1;i<=m;i++)
        if(dis[eg[i].to]!=dis[eg[i].from]+eg[i].d2)eg2[i].dis++;
    }
    void spfa2(int sart)
    {
        queue<int>q;
        memset(dis,0x3f,sizeof(dis));
        dis[sart]=0;
        vis[sart]=1;
        q.push(sart);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head2[u];i;i=eg2[i].nxt)
            {
                int v=eg2[i].to;
                if(dis[v]>dis[u]+eg2[i].dis){
                    dis[v]=dis[u]+eg2[i].dis;
                    if(!vis[v]){vis[v]=1;q.push(v);}
                }
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=m;i++)
        {
            cin>>a>>b>>c>>d;
            adde(b,a,c,d);    
        }
        spfa(n);
        spfa2(1);
        cout<<dis[n];
    }
  • 相关阅读:
    Servlet学习小结
    HTTP学习小结
    SpringMVC第二天
    使用Servlet 编写过滤器
    项目使用框架
    java-web
    SSM框架集成.下(供自己练习查阅用)
    SSM框架集成.中(供自己练习查阅用)
    SSM框架集成.上(供自己练习查阅用)
    debug
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/11626656.html
Copyright © 2011-2022 走看看