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];
}

猜你喜欢

转载自www.cnblogs.com/SFWR-YOU/p/11626656.html