首页 > 其他分享 >ACM预备队-week5(DFS/BFS/二分图)

ACM预备队-week5(DFS/BFS/二分图)

时间:2022-11-26 13:13:39浏览次数:109  
标签:dfs idx int ne ACM st BFS add DFS

[蓝桥杯 2013 国 C] 危险系数

题目链接:P8604 [蓝桥杯 2013 国 C] 危险系数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

割点:

删除这个顶点集合以所有顶点相关联的边以后,图的连通分量增多

其实就是求图的割点,找到“关键枢纽”,因为是稀疏图,所以用邻接表存图。

遍历起点->终点的所有路径(DFS),在遍历过程中,如果可以到达终点,则给中途经过的点的标记+1,找到从起点到终点路径数目相同的点(除去起点和终点),该数目即为ans

 1 #include <bits/stdc++.h>
 2 #define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
 3 using namespace std;
 4 const int N=2010;
 5 int n,m;
 6 bool vis[N];
 7 int st,ed;
 8 int tot;//表示起点到终点的路径数 
 9 int cnt[N];
10 int ans;
11 int h[N],e[N],ne[N],idx; 
12 void add(int a,int b)
13 {
14     e[idx]=b,ne[idx]=h[a],h[a]=idx++;
15 }
16 void dfs(int u)
17 {
18     vis[u]=true;
19     if(u==ed)
20     {
21         tot++;
22         for(int i=1;i<=n;i++)
23         {
24             if(vis[i])cnt[i]++;
25         }
26         return;
27     }
28     for(int i=h[u];i!=-1;i=ne[i])
29     {
30         int j=e[i];
31         if(!vis[j])
32         {
33             dfs(j);
34             vis[j]=0;
35         }
36     }
37     return;
38     
39 }
40 int main()
41 {
42     io;
43     cin>>n>>m;
44     memset(h,-1,sizeof h);
45     for(int i=0;i<m;i++)
46     {
47         int a,b;
48         cin>>a>>b;
49         add(a,b),add(b,a);
50     }
51     cin>>st>>ed;
52     dfs(st);
53     for(int i=1;i<=n;i++)
54     {
55         if(cnt[i]==tot)ans++;
56     }
57     ans-=2;
58     cout<<ans;
59     return 0;
60 }

图的遍历

题目链接:P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

稀疏图邻接表存图,反向真妙我真傻,从大到小遍历,经过的直接赋值最大点,O(n)复杂度,要不然1e5(⊙﹏⊙),基本正向就挂了

反向建图+DFS,不会缩点qwq

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4 int e[N],ne[N],idx,h[N];
 5 bool st[N];
 6 
 7 int ans[N];//用来存储答案
 8 void add(int a,int b)//表示在a后加入b这个点
 9 {
10     e[idx]=b,ne[idx]=h[a],h[a]=idx++;
11 }
12 void dfs(int u,int a)//对u这个节点赋值a
13 {
14     ans[u]=a;
15     st[u]=true;
16     for(int i=h[u];i!=-1;i=ne[i])
17     {
18         int j=e[i];
19         if(!st[j])dfs(j,a);
20     }
21 }
22 int main()
23 {
24     memset(h,-1,sizeof h);
25     int n,m;
26     cin>>n>>m;
27     for(int i=0;i<m;i++)
28     {
29         int a,b;
30         cin>>a>>b;
31         add(b,a);//反向建图
32     }
33     for(int i=n;i>=1;i--)
34     {
35         if(!st[i])dfs(i,i);
36     }
37     for(int i=1;i<=n;i++)
38     cout<<ans[i]<<' ';
39 }

【福建省历届夏令营】阳光大学

题目链接:P1330 封锁阳光大学 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

二分图,其实就是想把相邻的两个点染成不同的颜色,在每个连通块中加上两个颜色数目最小的点的数量,最后即为我要堵的答案

 1 #include <bits/stdc++.h>
 2 #define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) 
 3 using namespace std;
 4 const int N=1e5+10;
 5 int n,m;
 6 int h[N],e[N],ne[N],idx;
 7 void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;} 
 8 int cnt[3];//表示1和2的二分子连通图各自的数量 
 9 int color[N];
10 bool dfs(int u,int c)//节点是u,c表示颜色 
11 {
12     color[u]=c;
13     cnt[c]++;
14     for(int i=h[u];i!=-1;i=ne[i])
15     {
16         int j=e[i];
17         if(!color[j])//如果j这个点还没被染色 
18         {
19             if(!dfs(j,3-c))return false;//如果接下来染色失败 
20         }
21         else if(color[j]==c)return false;//如果染过色了,但是是冲突的 
22     }
23     return true;
24 }
25 signed main()
26 {
27     io;
28     cin>>n>>m;
29     memset(h,-1,sizeof h);
30     while(m--){int a,b;cin>>a>>b;add(a,b);add(b,a);}
31     int ans=0;
32     for(int i=1;i<=n;i++)
33     {
34         cnt[1]=0,cnt[2]=0;
35         if(!color[i])
36         {
37             if(!dfs(i,1)){cout<<"Impossible";return 0;}//没有被染色并且染色后还矛盾了
38         }
39         ans+=min(cnt[1],cnt[2]);
40     }
41     cout<<ans;
42     return 0;
43 }

 

标签:dfs,idx,int,ne,ACM,st,BFS,add,DFS
From: https://www.cnblogs.com/Zac-saodiseng/p/16927263.html

相关文章

  • ACM散题习题库5【持续更新】
    终于更新到5了,但是发现并不是做过的题仍然记得,所以现在应该着重记录一些相对简单且模板的题目了。  501.H-ClockHDU-6551【环上点覆盖问题】题意:给你一个环[0......
  • ACM 模式下的Java
    一、引入包相关importjava.util.*;二、基本输入相关涉及到输入需要提前创建一个键盘接收器Scannercin=newScaner(System.in);1、输入一个基本数据结构按照by......
  • [NEFU ACM大一暑假集训 解题报告]字典树
    [NEFUACM大一暑假集训解题报告]字典树题目A-L语言多模式匹配,AC自动机建立Trie图。不过这个题数据量很小,貌似可以暴力建立跳转关系,加上标记处理即可。对于样例的AC自动......
  • [NEFU ACM大一暑假集训 解题报告]前缀和与差分
    [NEFUACM大一暑假集训解题报告]前缀和与差分题量略大,所以解题报告和fjy大佬分了一下工由我负责A-K部分题解(不是AK部分题解啊,哈哈)后半部分题解(LM+R~V+XYZ)由fjy大佬发布......
  • [NEFU ACM] 2020级暑期训练 解题报告
    [NEFUACM]2020级暑期训练解题报告Author:2020-计6-zslID:FishingRod阅读须知需求指向:NEFU2020级ACM暑期训练参与人员解题报告博客偏向题解代码展示,解题视频偏向思路讲解......
  • [NEFU ACM大一暑假集训 解题报告]尺取法
    [NEFUACM大一暑假集训解题报告]尺取法前四题为例题,学长讲过了,直接贴代码了。题谱题目A-Subsequence求总和>=s的最短区间#include<cstdio>#include<cstdlib>#include<cma......
  • 分布式文件系统HDFS 相关概念知识
    一、HDFS的局限性:1.不支持实时处理的任务需求。但Hbase满足实时处理需求。2.无法高效存储大量的小文件,因为是以索引结构保存到内存当中去。3.不支持多用户写入以及任意修......
  • 【ACM】1.亲和数——中等
    题目描述 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 1+2+4+5+10+11+20+22+44+55+110=284。 而284的所有真约数为1、2、4、71......
  • FastDFS的安装和使用
    fastdfs是用 c 语言编写的一款开源的分布式文件系统,有多种原因的客户端(包括有Java的客户端)。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,......
  • 「WOJ 4701」Walk 虚点建图+01bfs
    前言模拟赛中,yzh遇到了这道题,但由于yzh没有学过01bfs。。。所以就一直在优化这道题,导致浪费了很长时间(但nfls的数据太水,dij和spfa都能过)Description给你一个\(n\)个......