P3720 [AHOI2017初中组]guide

Posted sfwr-you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 nodeint nxt,to,from,d1,d2;eg[501000];
struct ndint 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];

 

以上是关于P3720 [AHOI2017初中组]guide的主要内容,如果未能解决你的问题,请参考以下文章

[AHOI2017初中组]guide

luogu3720 [AHOI2017初中组]guide[最短路]

P3719 [AHOI2017初中组]rexp——递归模拟

P3717 [AHOI2017初中组]cover

Luogu P3717 [AHOI2017初中组]cover

[luogu p4447] [AHOI2018初中组]分组