zoukankan      html  css  js  c++  java
  • SPFA模板

     今天去听2015ZJOI浙江省队第二试的集训,早上就是听得云里雾里的ORZ,下午某两集训队大神过来将题目,第一个进了IOI的我只听懂了10%ORZ,第二个人机交互很好玩,找个时间单独写下。

       顺便附带膜拜各位聚聚,保我明天ZJOI不爆0........

       ORZZLD ORZYSY ORZWYH ORZCJH ORZZZQ

    好了切入正题——

    ============================华丽的分割线=====================

    今天我们来打打SPFA模板。

    去年NOIP我SPFA之前突击了下然后day2果然我就用spfa坑了T2 60分,简直了,然而T1写跪了,其实没啥区别。然后我就发现SPFA挺重要的,这几天重新捡起来看看。

    先(发)上代码再说

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAX=10000;
     4 struct node {
     5     int to,w,next;
     6 }edge[MAX];
     7 bool used[MAX];
     8 int outqueue[MAX],head[MAX],low[MAX],n,m;
     9 bool spfa(int start) {
    10     queue<int> q;
    11     used[start]=1;
    12     low[start]=0;
    13     q.push(start);
    14     while(!q.empty()) {
    15         int top=q.front();
    16         q.pop();used[top]=0;
    17         outqueue[top]++;
    18         if(outqueue[top]>n) return 0;
    19         for (int k=head[top];k!=-1;k=edge[k].next)
    20             if(low[edge[k].to]>low[top]+edge[k].w) {
    21                 low[edge[k].to]=low[top]+edge[k].w;
    22                 if(!used[edge[k].to]) {
    23                     used[edge[k].to]=1;
    24                     q.push(edge[k].to);
    25                 }
    26             }
    27     }
    28     return 1;
    29 }
    30 int main() {
    31     memset(used,0,sizeof(used));
    32     memset(head,-1,sizeof(head));
    33     memset(outqueue,0,sizeof(outqueue));
    34     memset(low,2100000,sizeof(low));
    35     scanf("%d%d",&n,&m);
    36     for (int i=1,k=0; i<=m; ++i) {
    37         int from,to,wei;
    38         scanf("%d%d%d",&from,&to,&wei);
    39         edge[k].to=to;
    40         edge[k].w=wei;
    41         edge[k].next=head[from];
    42         head[from]=k++;
    43     }
    44     if(spfa(1)) printf("%d
    ",low[n]);
    45     else printf("存在负权环!
    ");
    46     return 0;
    47 }
    View Code

    ===========================================================

    P.S:2015/5/22修改:原来的那份网络上的模板用完并没有将used清零,导致了一些小错误。

    今天在动车(高铁)上好好理解了下SPFA,弄明白了:

    next数组存的是和当前边一个起点的下/上一条边。

    head[i]存的是以i为起点有多少条边。

    w就不用讲了,边的权值。

    SPFA的复杂度为O(kE),k是常数,所以经常被fzyz的orz神牛们使用。

    ===========================================================

    其实SPFA也不难,就那样,有点小坑

    我是开了个结构体,个人不太喜欢(习惯)写指针,以前写指针跪了好多,果然指针没学好。。。

    我都不用指针的,除非万不得已,然而万不得已没有出现过。

    ——wyh大聚聚

    我都喜欢用指针,因为“->”看起来很有美感。。

    ——cjh大聚聚

    好吧话题跑歪了,下面列出可以参考的列表

    http://blog.csdn.net/chenjiang492943457/article/details/5375413

    http://www.cnblogs.com/devtang/archive/2011/08/25/spfa.html

    http://baike.baidu.com/link?url=O0QvxbOY8SVBjrIl6nF6EvMHSslgcEIxfXSoty5SbkA7QjbWZjTWARzwTQsKKbSD5mlASljndZrqYjle_qwcmq

    然而我发现SPFA还有优化!!!

    LLL和SLF,改天去看看,然后再写个模板

    最后声明下我并不是ZJ的 = =|||

    这篇文章由TonyFang发布。 所有解释权归TonyFang所有。 Mailto: tony-fang@map-le.net
  • 相关阅读:
    「干货分享」我所在团队的竞品分析模板--附下载
    框架用多了真的会死人的,spring-cloud全家桶与mybitais 集成完整示例(附下载)
    聊聊区块链,虽然我不挖矿!
    从厕所排队引发的产品设计方案思考
    基于spring-boot和docker-java实现对docker容器的动态管理和监控[附完整源码下载]
    Spring-boot原理(附带实现一个spring-boot-starter实例和代码下载)
    Zookeeper+websocket实现对分布式服务器的实时监控(附源码下载)
    「干货分享」模块化编程和maven配置实践一则
    【干货分享】大话团队的GIT分支策略进化史
    项目协作管理平台-teambition和tapd--深度体验
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/SPFAtem.html
Copyright © 2011-2022 走看看