• 1685. [NOI2014]魔法森林


                                                 1685. [NOI2014]魔法森林

    动态SPFA 

    求两个数的 最优值 我们可以限定一个值 求另一个的最优值 

    这个题 我们可以 对a排序 

    每次动态加边 

    就省去了 每次SPFA的dis和vis数组的清空  

    cogs上毫无压力 但是在UOJ上有一个额外的测试点 好像专门卡SPFA 

    毕竟这个正解应该是LCT嘛 

     1 #include <cctype>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #define max(a,b) a<b?b:a
     5 
     6 const int INF=0x3f3f3f3f;
     7 const int MAXN=50010;
     8 
     9 int n,m,ans;
    10 
    11 int dis[MAXN],vis[MAXN],q[10000000],id[MAXN];
    12 
    13 struct data {
    14     int u,v;
    15     int a,b;
    16     friend bool operator < (data x,data y) {
    17         return x.a<y.a;
    18     }
    19 };
    20 data p[MAXN<<1];
    21 
    22 struct node {
    23     int to;
    24     int a,b;
    25     int next;
    26     node() {}
    27     node(int to,int a,int b,int next):to(to),a(a),b(b),next(next) {}
    28 };
    29 node Edge[MAXN<<2];
    30 
    31 int head[MAXN],tot;
    32 
    33 inline void read(int&x) {
    34     int f=1;register char c=getchar();
    35     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
    36     for(;isdigit(c);x=x*10+c-48,c=getchar());
    37     x=x*f;
    38 }
    39 
    40 inline void swap(int&a,int&b) {int t=a;a=b;b=t;}
    41 
    42 inline void add(int x,int y,int a,int b) {
    43     Edge[++tot]=node(y,a,b,head[x]);
    44     head[x]=tot;
    45     Edge[++tot]=node(x,a,b,head[y]);
    46     head[y]=tot;
    47 }
    48 
    49 int hh() {
    50     freopen("magicalforest.in","r",stdin);
    51     freopen("magicalforest.out","w",stdout);
    52     read(n);read(m);
    53     for(int i=1;i<=m;++i) read(p[i].u),read(p[i].v),read(p[i].a),read(p[i].b);
    54     std::sort(p+1,p+1+m);
    55     for(int i=2;i<=n;++i) dis[i]=INF;
    56     ans=INF;
    57     for(int i=1;i<=m;++i) {
    58         add(p[i].u,p[i].v,p[i].a,p[i].b);
    59         int h=0,tail=2;
    60         q[1]=p[i].u;
    61         q[2]=p[i].v;
    62         vis[q[1]]=i;
    63         vis[q[2]]=i;
    64         while(h<tail) {
    65             int u=q[++h];
    66             vis[u]=0;
    67             for(int j=head[u];j;j=Edge[j].next) {
    68                 int v=Edge[j].to;
    69                 int t=max(dis[u],Edge[j].b);
    70                 if(dis[v]>t) {
    71                     dis[v]=t;
    72                     if(vis[v]!=i) q[++tail]=v,vis[v]=i;
    73                 }
    74             }
    75         }
    76         if(p[i].a+dis[n]<ans) ans=p[i].a+dis[n];
    77     }
    78     if(ans==INF) printf("-1
    ");
    79     else printf("%d
    ",ans);
    80     return 0;
    81 } 
    82 
    83 int sb=hh();
    84 int main(int argc,char**argv) {;}
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    妹妹
    小猴和北极熊
    盛趣->盛大
    运维
    操之过急
    修马路
    博人传
    醉酒
    【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式
    【Linux】Linux安装Tomcat
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7506283.html
Copyright © 2020-2023  润新知