首页 > 其他分享 >2024.04.09 图论复习

2024.04.09 图论复习

时间:2024-04-09 21:23:17浏览次数:30  
标签:2024.04 图论 ch int 09 head long read maxn

2024.04.09 图论复习

P3403 跳楼机

同余最短路模板题。

设 \(d_i\) 表示只使用向上移动 \(y\) 层或 \(z\) 层两种功能,所能达到的最低楼层 \(p\),其中 \(p\ mod\ x=i\) 。

两种连边方式:

  1. \(i\) 向 \((i+y)mod\ x\) 连权值为 \(y\) 的边;
  2. \(i\) 向 \((i+z)mod\ x\) 连权值为 \(z\) 的边;

则答案为:

\[\sum_{i=0}^{x-1}1+\lfloor\frac{h_i-d_i}{x}\rfloor \]

#include <bits/stdc++.h>
using namespace std;
#define ld long double
template <typename T>
inline T read(){
    T x=0;char ch=getchar();bool fl=false;
    while(!isdigit(ch)){if(ch=='-')fl=true;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return fl?-x:x;
}
#define read() read<int>()
#define LL long long
const int maxn = 1e5 + 10;
int head[maxn],cnt=0;
struct edge{
    int to,nxt;LL w;
}e[maxn<<1];
inline void link(int u,int v,LL w){
    e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;e[cnt].w=w;
}
int x,y,z;
LL h,dis[maxn];
bool vis[maxn];
#define Pair pair<LL,int>
void dij(int s){
    memset(dis,0x3f,sizeof dis);
    priority_queue<Pair,vector<Pair>,greater<Pair> > q;
    dis[s%x]=1;q.push(make_pair(0,s));
    while(q.size()){
        int u=q.top().second;q.pop();
        if(vis[u])continue;
        vis[u]=true;
        for(int i=head[u];i;i=e[i].nxt){
            int v=e[i].to;
            if(dis[v]>dis[u]+e[i].w){
                dis[v]=dis[u]+e[i].w;
                q.push(make_pair(dis[v],v));
            }
        }
    }
}
int main(){
    h=read<LL>();
    x=read();y=read();z=read();
    for(int i=0;i<x;i++){
        link(i,(i+y)%x,y);
        link(i,(i+z)%x,z);
    }
    dij(1);
    LL ans=0;
    for(int i=0;i<x;i++){
        if(dis[i]<=h)ans+=1+(h-dis[i])/x;
    }
    cout<<ans<<endl;
    return 0;
}

P3225 [HNOI2012] 矿场搭建

求出割点再从点双内部的点(非割点)出发,即可遍历到该 \(scc\) 的所有点,以统计大小等信息。

  1. 如果该点双内无割点,则需要建两个出口。
  2. 如果该点双内有且仅有一个割点,说明是缩点后的叶子节点,需要在除割点之外的位置建一个出口。
  3. 如果该点双内有两个及以上个割点,则不需要建出口。
#include <bits/stdc++.h>
using namespace std;
#define ld long double
template <typename T>
inline T read(){
    T x=0;char ch=getchar();bool fl=false;
    while(!isdigit(ch)){if(ch=='-')fl=true;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return fl?-x:x;
}
#define read() read<int>()
#define LL long long
const int maxn = 1e3 + 5;
int head[maxn],cnt;
struct edge{
    int to,nxt;
}e[maxn<<1];
inline void link(int u,int v){
    e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
int dfn[maxn],low[maxn],idx;
bool cut[maxn];
int tag[maxn],tim;
int rt,sz,num;
void tarjan(int u,int fa){
    dfn[u]=low[u]=++idx;
    int pson=0;
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==fa)continue;
        if(!dfn[v]){
            pson++;
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u] && u!=rt)cut[u]=true;
        }
        else low[u]=min(low[u],dfn[v]);
    }
    if(u==rt && pson>=2)cut[u]=true;
}
int n,m,kase;
inline void clear(){
    cnt=idx=rt=tim=sz=0;
    memset(head,0,sizeof head);
    memset(dfn,0,sizeof dfn);
    memset(low,0,sizeof low);
    memset(tag,0,sizeof tag);
    memset(cut,false,sizeof cut);
}
void dfs(int u,int fa){
    tag[u]=tim;
    if(cut[u])return ;
    sz++;
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==fa)continue;
        if(cut[v] && tag[v]!=tim)tag[v]=tim,num++;
        if(!tag[v])dfs(v,u);
    }
}
int main(){
    while(1){
        m=read();if(!m)break;
        clear();
        n=0;
        for(int i=1;i<=m;i++){
            int u=read(),v=read();
            link(u,v);link(v,u);
            n=max(n,max(u,v));
        }
        for(int i=1;i<=n;i++)if(!dfn[i]){
            rt=i;tarjan(i,0);
        }
        LL ans1=0,ans2=1;
        for(int i=1;i<=n;i++){
            if(tag[i] || cut[i])continue;
            sz=num=0;tim++;
            dfs(i,0);
            if(!num)ans1+=2,ans2*=1LL*sz*(sz-1)/2;
            else if(num==1)ans1++,ans2*=1LL*sz;
        }
        printf("Case %d: %lld %lld\n",++kase,ans1,ans2);
    }
    return 0;
}

CF909E Coprocessor

拓扑排序,但是不好直接在图上根据任务的执行情况(主处理器或副处理器)进行 \(dp\)。

可以每轮先把能进行的主处理器任务进行了,再进行副处理器任务直至再无可一起处理的副处理器任务,每轮操作的贡献即为 \(1\)。

#include <bits/stdc++.h>
using namespace std;
#define ld long double
template <typename T>
inline T read(){
    T x=0;char ch=getchar();bool fl=false;
    while(!isdigit(ch)){if(ch=='-')fl=true;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return fl?-x:x;
}
#define read() read<int>()
#define LL long long
const int maxn = 1e5 + 10;
int head[maxn],cnt;
struct edge{
    int to,nxt;
}e[maxn];
inline void link(int u,int v){
    e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
int n,m,op[maxn],deg[maxn];
int topo(){
    queue<int> q[2];
    for(int i=1;i<=n;i++){
        if(!deg[i])q[op[i]].push(i);
    }
    int ans=0;
    while(q[0].size() || q[1].size()){
        while(q[0].size()){
            int u=q[0].front();q[0].pop();
            for(int i=head[u];i;i=e[i].nxt){
                int v=e[i].to;
                if(--deg[v]==0)q[op[v]].push(v);
            }
        }
        if(q[1].size())ans++;
        while(q[1].size()){
            int u=q[1].front();q[1].pop();
            for(int i=head[u];i;i=e[i].nxt){
                int v=e[i].to;
                if(--deg[v]==0)q[op[v]].push(v);
            }
        }
    }
    return ans;
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++)op[i]=read();
    for(int i=1;i<=m;i++){
        int u=read()+1,v=read()+1;
        link(v,u);deg[u]++;
    }
    printf("%d\n",topo());
    return 0;
}

标签:2024.04,图论,ch,int,09,head,long,read,maxn
From: https://www.cnblogs.com/Liang-sheng/p/18124842

相关文章

  • 2024-04-09
    2024-04-09mushroom勾石线段树题,4个lazytag考场上会了,但是写出来第二个样例一直过不去发现每次询问全部从根pushup一遍就对了,于是超时拿到了30分的好成绩考完试对着aqz的代码改了一下午,发现一模一样,一直看不出错好心的aqz帮我看了看,2min就看到我有一个lft写成......
  • CF1097H Mateusz and an Infinite Sequence
    这种模非常小的数意义下的递归结构的区间查询显然可以抽象为\(O(d\log_{d}V)\)次信息的合并,问题的关键在于如何快速的处理信息的合并。一个非常\(\text{trival}\)的想法是每次合并时直接计算跨过分界点的区间个数,但这个严格不弱于通配符匹配问题,直接使用卷积只能做到\(O(nm......
  • 每日收获0409
    今天领导给了一个任务,让给程序加一个快测(原来就有,所以应该叫新功能)浏览了一遍代码后,发现只有一个轻触按键,短按开机和调档位,长按2s关机,增加新快测,考虑与长按2s关机一致,增加上电检测:首次上电时,初始化一个变量并赋初值(按需给予),之后每次循环时自减,直到0不再变化;照猫画虎,显示里有上电......
  • 算法模板 v1.12.1.20240409
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • mysql5.7迁移到8,如何解决问题 Illegal mix of collations (utf8mb4 general ci,IMPLIC
    SHOWVARIABLESLIKE'%character%';SHOWVARIABLESLIKE'collation%';showvariableswhereVariable_namelike'collation%';showvariableswhereVariable_nameLIKE'collation%'orVariable_nameLIKE'character_......
  • 模拟心电芯片LHE7909兼容代替ADS1291
    在大时代的浪潮下,以美国为首的欧美企业,对于中国实施制裁,不仅导致了局势的紧张,也导致了近年来芯片市场的混乱,部分进口芯片一度价格攀升。以心电芯片为例,高精度的ECG信号是医生用来准确判断用户心脏健康的依据。此类专用芯片技术门槛较高,目前主要被国外如TI,ADI等巨头公司垄断。......
  • 图论学习笔记
    Dijkstra单源最短路径堆优化。注意要定义成小根堆,而priority_queue默认大根堆再就是每个点最多入队一次,可以用vis数组记录证明:如果已经出队,说明队列中全都是val值比他大的(负权边?),这样他的val值一定已经是最终值了;如果没有入队,进行更改之后会在堆中体现,不需要担心之后还会更......
  • 20240409报错修改学习
    未配置SpringBoot配置注解处理器spring:datasource:druid:driver-class-name:com.mysql.jdbc.Driverurl:jdbc:mysql://localhost:3306/mini_springmvc?serverTimezone=UTCusername:rootpassword:1234mybatis-plus:global-config:......
  • [SDOI2009] Bill的挑战 (状压DP)
    [SDOI2009]Bill的挑战题目描述Sheng_bill不仅有惊人的心算能力,还可以轻松地完成各种统计。在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng_bill极度的不满。于是他再次挑战你。这次你可不能输。这次,比赛规则是这样的:给出\(N\)个长度相同的字符串(由小写英文......
  • 混辗式混砂机 变速箱 旋耕灭茬机 污水处理 150T液压机 污水处理厂 饺子机 农村生活污
    UHT管式杀菌机说明书混辗式混砂机机械结构设计 论文CAD图纸开题报告毕业设计之专用机床图纸毕业设计推钢机液压图纸毕业设计3吨叉车3进3退变速箱(毕业设计)1G-160型旋耕灭茬机中央传动装置设计(共17张CAD加说明书与侧边传动装置配套污水处理课程设计图集150T液压机设计【10......