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
  • 相关阅读:
    开始学习编写用于 Windows SideShow 设备的小工具【转】
    Windows Mobile 6.5 Developer Tool Kit 下载
    Microsoft Security Essentials 微软免费杀毒软件下载
    SQL Server 2008 空间数据存储摘抄(SRID 点 MultiPoint LineString MultiLineString 多边形 MultiPolygon GeometryCollection)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (2)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (4)
    负载测试、压力测试和性能测试的异同
    Windows Server 2008 Vista Sidebar Gadget (侧边栏小工具) 入门开发实例
    Silverlight Tools 安装失败 解决办法
    SQL Server 2008 空间数据库 空间索引概念及创建(取自帮助)
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/SPFAtem.html
Copyright © 2011-2022 走看看