NEUQ ACM预备队训练-week5(图的基础存图和dfs)
P8604 [蓝桥杯 2013 国 C] 危险系数
题目背景
抗日战争时期,冀中平原的地道战曾发挥重要作用。
题目描述
地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
我们来定义一个危险系数 DF(x,y):
对于两个站点 x 和 y(x≠y), 如果能找到一个站点 z,当 z 被敌人破坏后,x 和 y 不连通,那么我们称 z 为关于 x,y 的关键点。相应的,对于任意一对站点 x 和 y,危险系数 DF(x,y) 就表示为这两点之间的关键点个数。
本题的任务是:已知网络结构,求两站点之间的危险系数。
输入格式
输入数据第一行包含 2 个整数 n(2≤n≤1000),m(0≤m≤2000),分别代表站点数,通道数。
接下来 m 行,每行两个整数 u,v(1≤u,v≤n,u≠v) 代表一条通道。
最后 1 行,两个数 u,v,代表询问两点之间的危险系数 DF(u,v)。
输出格式
一个整数,如果询问的两点不连通则输出−1。
输入样例
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
输出样例
2
解答代码
#include <bits/stdc++.h>using namespace std;
int n,m;
bool vis[10001];
vector<int>G[10001];
int st, ed,total=0;
int cnt[10001]={0};
void dfs(int now)
{if(now==ed){total++;for(int i=1;i<=n;i++){if(vis[i]){cnt[i]++;}}return;}for(int i=0;i<G[now].size();i++){int to=G[now][i];if(!vis[to]){vis[to]=true;dfs(to);vis[to]=false;}}return;
}
int main()
{cin>>n>>m;for(int i=1;i<=m;i++){int x,y;cin>>x>>y;G[x].push_back(y);G[y].push_back(x);}cin>>st>>ed;vis[st]=true;dfs(st);int ans=0;for(int i=1;i<=n;i++){if(cnt[i]==total){ans++;}}ans-=2;cout<<ans;
}
思路
采用dfs搜索从st到ed的所有路径,记录总数total,经过的点i记录经过的次数cnt[i],如果存在一个点经过的次数cnt[i]等于路径总数total,则该点为关键点。
P3916 图的遍历
题目描述
给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点。
输入格式
第 1 行 22 个整数 N,M,表示点数和边数。
接下来 M 行,每行 2 个整数 Ui,Vi,表示边 (Ui,Vi)。点用 1,2,…,N 编号。
输出格式
一行 N 个整数 A(1),A(2),…,A(N)。
输入样例
4 3
1 2
2 4
4 3
输出样例
4 4 3 4
解答代码
#include <bits/stdc++.h>using namespace std;
int n,m;
int vis[100001];
vector<int>G[100001];
int max;
int cnt[10001]={0};
void dfs(int now,int x)
{if(vis[now]){return;}vis[now]=x;for(int i=0;i<G[now].size();i++){dfs(G[now][i],x);}return;
}
int main()
{cin>>n>>m;for(int i=1;i<=m;i++){int x,y;cin>>x>>y;G[y].push_back(x);}for(int i=n;i>=1;i--){dfs(i,i);}for(int i=1;i<=n;i++){cout<<vis[i]<<" ";}
}
思路
因为是有向图,所以不能两个数都push_back。因为只要找到能到达的最大的点,所以可以反向建边, 同时dfs的顺序从大到小,可以使路过的点的vis都赋最大的,如果已经赋过值,就说明已经找到过最大值,所以函数里就直接return,防止找到的最大值被较小值覆盖。
P1330 封锁阳光大学
题目描述
曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。
阳光大学的校园是一张由 n 个点构成的无向图,n 个点之间由 m 条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。
询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。
输入格式
第一行两个正整数,表示节点数和边数。 接下来 m 行,每行两个整数 u,v,表示点 u 到点 v 之间有道路相连。
输出格式
仅一行如果河蟹无法封锁所有道路,则输出 Impossible
,否则输出一个整数,表示最少需要多少只河蟹。
输入样例#1
3 3
1 2
1 3
2 3
输出样例#1
Impossible
输入样例#2
3 2
1 2
2 3
输出样例#2
1
说明/提示
【数据规模】
对于 100% 的数据,1≤n≤10^4,1≤m≤10^5,保证没有重边。
解答代码
#include<bits/stdc++.h>using namespace std;
vector <int>a[10001];
bool vis[10001];
int sum[2];
int color[10001]={0};
struct Edge
{int t;int nexty;
}edge[100001];
int head[100001];
int cnt=0;
void add(int a,int b)
{cnt++;edge[cnt].t=b;edge[cnt].nexty=head[a];head[a]=cnt;
}bool dfs(int x,int c)
{if(vis[x]){if(color[x]==c) return true;return false;}vis[x]=true;color[x]=c;sum[color[x]]++;bool flag=true;int i=head[x];while(i!=0&&flag){flag=flag&&dfs(edge[i].t,1-c);i=edge[i].nexty;}return flag;
}
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=m;i++){int x,y;cin>>x>>y;add(x,y);add(y,x);}int ans=0;for(int i=1;i<=n;i++){if(vis[i]){continue;}sum[0]=0;sum[1]=0;if(!dfs(i,0)){cout<<"Impossible";return 0;}ans+=min(sum[0],sum[1]);}cout<<ans;
}
思路
这题有点难,一开始没什么思路,就参考了下题解,知道了可以将这道题看成是染色问题,由两种颜色,用color的数组下标0和1表示,color数组记录每种颜色出现的次数,然后答案取两种颜色个数的最小值。
中间填色的过程,用dfs,下次调用dfs时要换种颜色,故输入的第二个值是1-c。
当dfs遇到已经走过的地方,比较两次要填入的颜色,如果不同则说明相同颜色相邻了,就返回false,即输出Impossible,如果相同则说明可以完成题意,输出两种颜色个数的较小值。
NEUQ ACM预备队训练-week5(图的基础存图和dfs)相关推荐
- 图神经网络基础--基于图神经网络的节点表征学习
图神经网络基础–基于图神经网络的节点表征学习 引言 在图节点预测或边预测任务中,首先需要生成节点表征(Node Representation).我们使用图神经网络来生成节点表征,并通过基于监督学习的对 ...
- NEUQ-acm 预备队训练Week5—图论
本周基于BFS/DFS进一步练习,涉及连通图知识 P8604 [蓝桥杯 2013 国 C] 危险系数 题目背景 抗日战争时期,冀中平原的地道战曾发挥重要作用. 题目描述 地道的多个站点间有通道连接,形 ...
- 【阿里云课程】图神经网络基础:图的应用、表示与图卷积
大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第9课中的一节,介绍如下: 图神经网络基础 本次课程是阿里天池联合有三AI推出的深度学习系列课程第9期,讲述图神经网络,图的 ...
- ACM图论之存图方式
<转--剑紫青天> 对于ACM图论方面的题目总是免不了首先要建图存图,使用合适的存图方式不但是AC的必要条件,解题事半功倍. 以下主要分析三种常见的存图方式的优缺点以及代码实现 邻接矩阵 ...
- 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...
- 【恋上数据结构】图代码实现、BFS、DFS、拓扑排序
图代码实现 图的基础代码 顶点Vertex 边Edge 添加边addEdge 删除边removeEdge 删除点removeVertex 完整源码 图的遍历 广度优先搜索(Breadth First ...
- 海康工业相机LabVIEW二次开发——修改参数、存图
最近使用LabVIEW对海康机器人的工业相机进行二次开发,没有专门介绍LabVIEW的开发手册,本文就简单的写一写单相机取图显示以及存图的开发步骤. 如果各位是直接使用IMAQdx开发的,可以直接下载 ...
- 海康工业相机连续存图、录像功能介绍
海康工业相机连续存图功能介绍 1.MVS连续存图功能基本使用方法 2.抓图测试与实际问题分析 总结 3. SDK代码开发关键接口介绍 在使用工业相机做日常的数据采集,分析过程中,存图.录像功能必不可少 ...
- 【赠书】图神经网络基础与前沿最新书籍,赠5本学习
假期快要到了,本次给大家赠送5本人工智能领域的技术书籍,这次赠送的书籍是<图神经网络基础与前沿>. 这是一本什么样的书 图神经网络是近两年学术界的热点,在顶级会议上的文章越来越多.目前图像 ...
最新文章
- Datawhale来厦大啦!
- 深入解剖unsigned int 和 int
- [Spring cloud 一步步实现广告系统] 13. 索引服务编码实现
- 那些年,我们踩过的 Java 坑
- How is data replicted from HANA to AS
- 教你如何创建一款属于自己的VSCode主题
- 【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value
- python3 web服务器_python3 简单web服务器
- plsql developer 安装在win7 64位电脑路径问题
- 社区团购会一直走下去吗?
- ygbook和ptcms哪个好_长期更新,国内所有小说建站系统整理
- 惠普m128fn中文说明书_惠普M128fw使用说明书
- java计算ipv6前缀位数
- R语言差异检验:非参数检验
- ps设计精讲精练笔记
- 个人微信低成本引流实战教程方法
- 微信小程序云开发云数据库_聚合操作_联表查询_对象数组某字段与另一集合的某字段相等匹配
- 【MySQL】navicat for mysql 安装及使用
- cad应用技巧:图层特性管理器
- 共模扼流圈的工作原理与作用以及特点和应用详解
热门文章
- 面试常问集锦——Java基础部分
- 最喜欢的科技资讯类英文网站
- macOS python3.10出现findfont: Font family [‘sans-serif‘] not found报错的解决方法。
- 今日参与会议后的感悟
- TIA博途软件中程序编辑区标题上的收藏快捷指令取消了,如何恢复显示?
- “损失函数”是如何设计出来的?直观理解“最小二乘法”和“极大似然估计法”
- strassen矩阵乘法 java_矩阵乘法Strassen算法
- Vue data 中随意更改一个属性,视图都会被更新吗?
- 送你个低代码福利,错过要再等一年
- 5G DL PRS(Positioning Reference Signal) -- 下行定位参考信号