zoukankan      html  css  js  c++  java
  • BZOJ 1726 严格次短路

    不说什么了,模板题

    题目数据有点弱,不严格的次短路也能ac。。。。

    View Code
      1 #include <cstring>
      2 #include <cstdlib>
      3 #include <algorithm>
      4 #include <iostream>
      5 #include <cstdio>
      6 
      7 #define N 100000
      8 #define M 2000000
      9 
     10 using namespace std;
     11 
     12 struct HP
     13 {
     14     int x,d;
     15 }hp[M];
     16 
     17 int head[N],next[M],dis[N],to[M],len[M],cnt,n,qk,m,q[M],cs[N],size;
     18 bool vis[N];
     19 
     20 inline void add(int u,int v,int w)
     21 {
     22     to[cnt]=v; len[cnt]=w; next[cnt]=head[u]; head[u]=cnt++;
     23 }
     24 
     25 inline bool cmp(const HP &a,const HP &b)
     26 {
     27     return a.d+dis[a.x]>b.d+dis[b.x];
     28 }
     29 
     30 void read()
     31 {
     32     memset(head,-1,sizeof head); cnt=0;
     33     for(int i=1,a,b,c;i<=m;i++)
     34     {
     35         scanf("%d%d%d",&a,&b,&c);
     36         add(a,b,c); add(b,a,c);
     37     }
     38     qk=2;
     39 }
     40 
     41 void spfa()
     42 {
     43     memset(dis,0x3f,sizeof dis);
     44     int h=1,t=2,sta;
     45     q[1]=n; vis[n]=true; dis[n]=0;
     46     while(h<t)
     47     {
     48         sta=q[h++];
     49         vis[sta]=false;
     50         for(int i=head[sta];~i;i=next[i])
     51             if(dis[to[i]]>dis[sta]+len[i])
     52             {
     53                 dis[to[i]]=dis[sta]+len[i];
     54                 if(!vis[to[i]]) vis[to[i]]=true,q[t++]=to[i];
     55             }
     56     }
     57 }
     58 
     59 int bfs()
     60 {
     61     memset(cs,0,sizeof cs);
     62     bool fg=false;int mindis=-1;
     63     hp[1].x=1; hp[1].d=0; size=1;
     64     while(size)
     65     {
     66         HP sta=hp[1];
     67         pop_heap(hp+1,hp+1+size,cmp); size--;
     68         
     69         if(sta.x!=n) cs[sta.x]++;
     70         else if(sta.d!=mindis) cs[sta.x]++;
     71         
     72         if(sta.x==n&&!fg)
     73         {
     74             mindis=sta.d;
     75             fg=true;
     76         }
     77         if(cs[n]==qk) return sta.d;
     78         if(cs[sta.x]>qk) continue;
     79         for(int i=head[sta.x];~i;i=next[i])
     80         {
     81             size++;
     82             hp[size].x=to[i]; hp[size].d=sta.d+len[i];
     83             push_heap(hp+1,hp+1+size,cmp);
     84         }
     85     }
     86 }
     87 
     88 void go()
     89 {
     90     spfa();
     91     if(1==n) qk++;
     92     printf("%d\n",bfs());
     93 }
     94 
     95 int main()
     96 {
     97     while(scanf("%d%d",&n,&m)!=EOF)
     98     {
     99         read();
    100         go();
    101     }
    102     return 0;
    103 } 
    没有人能阻止我前进的步伐,除了我自己!
  • 相关阅读:
    Maximum sum-动态规划
    Ubuntu14下Hadoop开发&lt;1&gt; 基础环境安装
    POJ 3252 Round Numbers 数学题解
    ubuntu环境 rake aborted!
    oracle decode函数用法
    Android多线程研究(1)——线程基础及源码剖析
    2014冬去春来
    Android中的动画详解系列【4】——Activity之间切换动画
    JavaScript你所不知道的困惑(3)
    研发人员技术定级的一些思考
  • 原文地址:https://www.cnblogs.com/proverbs/p/2745554.html
Copyright © 2011-2022 走看看