【2019寒假集训DAY2】图论

Dijkstra

  • 条件:无负权;时间:O(n*n)
  • 详解+模板: https://www.cnblogs.com/jason2003/p/7222182.html
  • (模板)P1821 [USACO07FEB]银牛派对Silver Cow Party:https://www.luogu.org/recordnew/show/12339877
  • void dj(){
        for(int i=1;i<=m;i++)
          if(i!=k)dis[i]=M;
    
        for(int i=1;i<=m;i++){
            int min=M;
            for(int j=1;j<=m;j++)
              if(b[j]==0&&dis[j]<min){
                min=dis[j];
                t=j;
              }
            b[t]=1;
            if(t==s)return;
            for(int j=1;j<=m;j++)
              if(b[j]==0&&a[t][j]>0&&dis[j]>dis[t]+a[t][j]){
                dis[j]=dis[t]+a[t][j];
              }
        }
    }
  • 步骤:
  1. dis[i]记录到源点距离; vis[i]判断被标记否;a[u][v]=w;
  2. 初始化:源点为0,其他点inf
  3. 选择并标记k点:选择未被标记的k点,d[k]最小;vis[k]=1;
  4. 修改其他未标记、过k点点j到源点距离:vis[j]=0&&a[u][v]>0&&dis[j]>dis[k]+a[k][j];
  • 堆优化

Floyd

  • 条件:无负环;时间:O(n*n*n);DP思想
  • (模板)P1346 电车:https://www.luogu.org/problemnew/show/P1346
  • 模板
  1. 初始化:s[i][i]=0;s[i][j]读入;(根据题可能有改动,电车就设为要下车改变路线则=1,不用=0)
  2. 三层循环,k在最外层;s[i][j]>s[i][k]+s[k][j]
for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i!=j) s[i][j]=M;
        }
    }

    for(int i=1;i<=n;i++){
        cin>>x;
        for(int j=1;j<=x;j++){
            cin>>y;
            if(j==1) s[i][y]=0;
            else s[i][y]=1;
        }
    }

    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(s[i][j]>s[i][k]+s[k][j]){
                    s[i][j]=s[i][k]+s[k][j];
                }
            }
        }
    }
  • Floyd求最小环
  1. #10072. 「一本通 3.2 例 1」Sightseeing Trip:https://loj.ac/problem/10072
  2. 附STL中vector用法:vector<ll>path; path.clear();path.push_back(i);path.size()path[i]
  3. 附memcpy用法:memcpy(mp,dist,sizeof(dist));
  4. 附代码

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    ll n,m,dist[200][200],mp[200][200],huan[200][200],x,y,z,len=inf;
    vector<ll>path;
    void get(ll x,ll y){
        if(huan[x][y]==0)return;
        get(x,huan[x][y]);
        path.push_back(huan[x][y]);
        get(huan[x][y],y);
    }
    int main()
    {
        cin>>n>>m;
        memset(dist,inf,sizeof(dist));
        for(ll i=1;i<=n;i++)dist[i][i]=0;
        for(ll i=1;i<=m;i++){
            cin>>x>>y>>z;
            dist[x][y]=dist[y][x]=min(dist[x][y],z);
        }
        memcpy(mp,dist,sizeof(dist));
        for(ll k=1;k<=n;k++){
            for(ll i=1;i<k;i++){
                for(ll j=i+1;j<k;j++){
                    if(len>dist[i][j]+mp[i][k]+mp[k][j]){
                        len=dist[i][j]+mp[i][k]+mp[k][j];
                        path.clear();
                        path.push_back(i);
                        get(i,j);
                        path.push_back(j);
                        path.push_back(k);
                    }
                }
            }
            for(ll i=1;i<=n;i++){
                for(ll j=1;j<=n;j++){
                    if(dist[i][j]>dist[i][k]+dist[k][j]){
                        dist[i][j]=dist[i][k]+dist[k][j];
                        huan[i][j]=huan[j][i]=k;
                    }
                }
            }
        }
        //先更新最小环再更新最短路:否则dist[i][j]会改变
        //无向图对称性:j从i+1开始
        //i、j<k:https://www.cnblogs.com/zzqc/p/6855913.html
        if(len==inf)cout<<"No solution.";
        else{
            for(ll i=0;i<path.size();i++)
            {
                cout<<path[i]<<" ";
            }
        }
        return 0;
    }

    5.附有向环:https://vijos.org/p/1423; 代码(直接跑floyd):

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define inf 0x3f3f3f3f
    int n,m,e[210][210],w[210];
    int main(){
        cin>>n>>m;
        memset(e,inf,sizeof(e));
        for(ll i=1;i<=n;i++)cin>>w[i];
        for(ll i=1;i<=m;i++){
            int x,y,z;
            cin>>x>>y>>z;
            e[x][y]=min(e[x][y],z+w[x]);
        }
        for(ll k=1;k<=n;k++){
            for(ll i=1;i<=n;i++){
                for(ll j=1;j<=n;j++){
                    e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
                }
            }
        }
        if(e[1][1]==inf)cout<<"-1";
        else cout<<e[1][1];
        return 0;
    }

原文地址:https://www.cnblogs.com/songjian-jiansong/p/10306027.html

时间: 2024-10-15 19:53:01

【2019寒假集训DAY2】图论的相关文章

【2019寒假集训DAY1】背包问题

基本信息 金矿模型理解:http://www.cnblogs.com/sdjl/articles/1274312.html 适用条件: 重叠子结构.最优子问题.边界.子问题独立+转移方程式 背包九讲(结合题目):http://www.cnblogs.com/jbelial/articles/2116074.html 框架 01背包问题: 无优化 for(int i=1;i<=n;i++) { for(int c=0;c<=m;c++) { f[i][c]=f[i-1][c]; if(c>

Contest1692 - 2019寒假集训第三十一场 UPC 11075 Problem D 小P的国际象棋

非常简单的单点修改+区间加+区间查询.我用的是最近刚学的区间修改版本树状数组.  直接维护即可,注意修改后的单点值已经不是a[i],或者b[i],要通过区间查询求单点.不然是错的. 区间修改版本树状数组: #include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #define LL long long using namespace std; LL c_p[400

CSU-ACM寒假集训选拔-入门题

CSU-ACM寒假集训选拔-入门题 仅选择部分有价值的题 J(2165): 时间旅行 Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0,?h] 中. 当 Bobo 位于时间轴上 t 点,同时时间机器有 c 单位燃料时,他可以选择一个满足 \(\lceil\frac{x}{h}\rceil\leq c\) 的非负整数 x, 那么时间机器会在 [0,?x]中随机整数 y,使 Bobo 回到 (t???y) 点,同时消耗 y 单位燃料. (其中 ?

正睿OI国庆DAY2:图论专题

正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力说做法是dfs 首先两个点一定在点双联通分量里 点双是简单环,只有两条,不存在 猜测其他情况存在三条 双联通分量分解 输出情况可以用dfs树判,讨论非树边覆盖情况 内包含 下面分叉连到上面 相交 输出点即可 BFS/例题 BFS树没有跳跃边 计数/动态规划有用吧 树上bfs序好像可以判断距离? 边权

2019寒假小记

Preface 菜鸡HL终于艰难地熬过了初三的一个学期迎来了寒假. 但是由于某些不可言说的政策问题所以他要没高中读了,只能开始准备中考. 所以这个寒假可能并不像想象中的那样可以大量刷题好吧题还是要做的 希望\(ZJOI\)能\(Keep\ good\ luck\)吧,进不了前\(48\)就要考虑退役了. 1-26 早上搬东西发成绩单听老杨浩BB,搞到\(10\)点种才放. ZLX很早就走了,心想有点不对,肯定是去机房了. 所以推测HW的人都去机房了,于是我决定也去机房玩玩. 把东西拿到老爸车上就

寒假集训总结

这个寒假的集训吧,缺少了总结. 首先去了秦皇岛的几天还是挺不错的,但是人还是很懒散,没有每日做总结,导致以前会做的题目不会做.COME OJ上的视频也没有看完.秦皇岛开阔了眼界吧. 放寒假前的几天吧,都在聊天,唉,真的有时候会感到孤独... 只写了两场CF的所有题题解对的.(还缺178场) 之后回学校吧一个人在寝室就看看游戏直播的视频,嗯,挺荒废的. 寒假的收货吧,会了时间线段树,一些些STL,dp做了总结,分块+暴力的方法. 之后应该干什么呢,3月17校赛,3月底天梯,4月初浙大校赛,4月底浙

2017清北学堂集训笔记——图论

我们进入一个新的模块——图论! emmmmm这个专题更出来可能有点慢别介意,原因是要划的图和要给代码加的注释比较多,更重要的就是...这几个晚上我在追剧!!我们的少年时代超级超级超级好看,剧情很燃啊!!咳咳,好吧下面回归正题. 一.图的存储: 1.邻接矩阵: 假设有n个节点,建立一个n×n的矩阵,第i号节点能到达第j号节点就将[i][j]标记为1(有权值标记为权值), 样例如下图: 1 /*无向图,无权值*/ 2 int a[MAXN][MAXN];//邻接矩阵 3 int x,y;//两座城市

长沙雅礼中学集训-------------------day2

怎么说呢,今天的题特别的神奇,因为emmmmmm,T1看不懂(一直到现在还没有理解明白期望概率什么的),T2题面看不懂+扩展欧几里得求逆元怎么求我忘了,T3哇,终于看懂一题了,然而写了个50分的程序但是只拿到了20. day2考试就写了T3,还好写了分段,不然可能就要爆零了(写的是50分的程序,但是很明显我的思路出问题了所以只拿了20分的暴力分) T1:对于一个0/1串,其中一个全为1长度为x的子串会加x^3+k,一个全为0长度为x的子串会减x^2+k,现告诉每个位置为1的概率,求期望的分数.数

高一寒假集训总结

集训的一天 早读改前一天晚上没过的题. 上午学新课,开新的一套题,学模版优化模版.前半段总是没睡醒,将近中午时效率是一天中最高的.一般不大讨论. 下午继续做题,效率也比较高.讨论比上午多. 晚上思路很乱,而且一般都是做到一套题的后几道,进程缓慢,有些错误往往要到第二天早上才能想通. 集训之最 最有感触的一道题:家谱树.为了存人名现学关联式容器,发现大家课下确实学了不少东西,开学之后要拿更多时间读奥赛书,自学一些内容. 最佩服的一种解法:王超星的挖水井.这道题我做了很久,还是没能解决.请教王超星的