ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[NOI2014]魔法森林[最短路 spfa]

2019-10-13 20:56:03  阅读:207  来源: 互联网

标签:int 短路 NOI2014 vis spfa ans push dis


[NOI2014]魔法森林

一条边有\(a_i,b_i\)两个权值 求\(1->n\)路径上\(a\)的最大值与\(b\)的最大值之和的最小

==有lct的做法 但是spfa动态加点的做法也很巧妙!

先将其按\(a\)从小到大排序 然后依次加入边

对于ans的每次更新 当ans第一次更新时说明在加入这条边后才存在\(1->n\)的路 而新加的这条边一定在\(1->n\)的路径上
之后的更新也差不多同理(寄几想一想为什么

每加入一条边 就只用从新加入的这条边的\(u,v\)来开始更新 不用跑完==

int dis[N],vis[N];
queue<int> q;
void spfa(int a,int b){
    vis[a]=vis[b]=1;
    q.push(a),q.push(b);
    while(!q.empty()){
        int u=q.front();q.pop(),vis[u]=0;
        for(int i=head[u],v,w;i;i=e[i].nxt)
            if(dis[v=e[i].v]>Max(dis[u],w=e[i].w)){
                dis[v]=Max(dis[u],e[i].w);
                if(!vis[v]) q.push(v),vis[v]=1;
            }
    }
}

int main(){
#ifndef ONLINE_JUDGE
   // freopen("in.txt","r",stdin);
#endif
    rd(n),rd(m);ans=inf;
    memset(dis,inf,sizeof(dis));
    for(int i=1,u,v,a,b;i<=m;++i) rd(u),rd(v),rd(a),rd(b),E[i]=(node){u,v,a,b};
    sort(E+1,E+m+1,cmp);
    dis[1]=0;
    for(int i=1,u,v,w;i<=m;++i){
        u=E[i].u,v=E[i].v,w=E[i].b;
        add(u,v,w),add(v,u,w);
        spfa(u,v);
        ans=Min(ans,dis[n]+E[i].a);
    }
    if(ans==inf) return puts("-1"),0;
    printf("%d",ans);
    return 0;
}

标签:int,短路,NOI2014,vis,spfa,ans,push,dis
来源: https://www.cnblogs.com/lxyyyy/p/11668255.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有