zoukankan      html  css  js  c++  java
  • bzoj2200[Usaco2011 Jan]道路和航线*

    bzoj2200[Usaco2011 Jan]道路和航线

    题意:

    n点图,两种边:有向边,权值可能为负数。无向边,权值为正数。求单源最短路。n≤25000,边数≤100000。

    题解:

    听说spfa会挂,于是写了dijkstra,WA了n次后才知道dijkstra不能处理负权边QAQ。后来在ZS大爷的教导下用SLF优化spfa就过了。不过正解似乎是缩点后再dijkstra,代码量大,不会写。

    SLF优化:在点即将入队时比较:如果其d值<队列头元素的d值则由队列头插入否则由队列尾插入,此处注意用STL的deque在比较队头时要判断队列会不会为空。听说此优化可以防很多卡spfa的姿势。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <deque>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define maxn 500010
     7 #define INF 2147483647
     8 using namespace std;
     9 
    10 inline int read(){
    11     char ch=getchar(); int f=1,x=0;
    12     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    13     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    14     return f*x;
    15 }
    16 int n,m1,m2,s,d[maxn]; bool inq[maxn];
    17 struct e{int t,w,n;}; e es[maxn*4]; int ess,g[maxn];
    18 void pe(int f,int t,int w){es[++ess]=(e){t,w,g[f]}; g[f]=ess;}
    19 deque<int>dq;
    20 void spfa(){
    21     inc(i,1,n)d[i]=INF; d[s]=0; dq.push_back(s); inq[s]=1;
    22     while(!dq.empty()){
    23         int x=dq.front(); dq.pop_front(); inq[x]=0;
    24         for(int i=g[x];i;i=es[i].n)if(d[es[i].t]>d[x]+es[i].w){
    25             d[es[i].t]=d[x]+es[i].w;
    26             if(!inq[es[i].t]){
    27                 if(!dq.empty()&&d[dq.front()]>d[es[i].t])dq.push_front(es[i].t);else dq.push_back(es[i].t);
    28                 inq[es[i].t]=1;
    29             }
    30         }
    31     }
    32 }
    33 int main(){
    34     n=read(); m1=read(); m2=read(); s=read();
    35     inc(i,1,m1){int a=read(),b=read(),c=read(); pe(a,b,c); pe(b,a,c);}
    36     inc(i,1,m2){int a=read(),b=read(),c=read(); pe(a,b,c);} spfa();
    37     inc(i,1,n){d[i]==INF?puts("NO PATH"):printf("%d
    ",d[i]);} return 0;
    38 }

    20161013

  • 相关阅读:
    SQL对Xml字段的操作
    五种常见的ASP.NET安全缺陷
    EntityFramework中常用的数据删除方式
    002_ASP.NET 换主题
    001_ASP.NET MVC 实用教程 论坛项目 北盟网校 原创视频教程
    LINQ to Entities 比较日期
    windows10多桌面创建 切换 和分屏
    winform的combox下拉框绑定数据源
    C# 怎么让winform程序中的输入文本框保留上次的输入
    dos 批量重命名 bat
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5978850.html
Copyright © 2011-2022 走看看