【暑假集训】之被ACM金牌大神虐的第二天之图论篇

分享了三道图论算法问题的解决思路与代码实现:Electricity2、图上删点与JzzhuandCities。同时讨论了如何在特定条件下使用三种颜色进行染色、图的联通性变化及最小路径优化问题。最后提供了Exploration和TricksDevice的算法思路与代码难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【感想1】:今天是ACM金牌大神来讲的第二天,话说第一天的内容都还没写完。。QAQ,不过还是先写今天的吧。。。再见

Electricity 2(Gym 100345C)
给出一个简单无向图G,对于图G上的任意一个点P,设N(P)为和P直接相邻的点的集合。对于任意的v,w属于N(P),都存在一条从v到w只经过N(P)上点的路径。问是否存在一种只用3种颜色的染色方案,使得每条边两端点颜色不同?
【思路】:
考虑任意一个点P,和他相邻的点至少要构成一颗树。考虑新加一个点Q,首先Q与P相连,Q必然至少还要和N(P)中的一个点相连,我们设与Q相连的那个点为T,假设我们已经染好了一部分图的颜色。这时候来了一个点Q,Q按照上面的分析,Q至少和两个点相连,即P和T。又因为P,T原本相连。所以P和T必然具有两种不同的颜色。Q的颜色唯一确定,实现的时候,我们优先找邻点有两个颜色的点,把他们染色,实在找不到就找邻点只有一个颜色的点,随便把他染成一个合法颜色,如果还没有,就找邻点没有颜色的,然后随便染一个。(PS.这里还提到过二分图,是只染两种色的情况,不太懂,下来要去找资料),
【代码】:代码依旧没时间实现。。
图上删点
给出一个无向图,有n个点,每个点都有一个权值。有一些操作,每次操作删除图上所有权值小于一个数的点。对于每次操作,询问当前和1号点联通的点有多少个。
【思路】:
首先,我们可以考虑图可能的形态有n种,我们可以预处理出每种形态下与1联通的点有多少个(怎么预处理,大神求教啊),首先读入点,把点按权值保存,按权值顺序加入图中,(这样真的可以么),用并查集维护当前和1号点联通的点的个数。对于每次询问,找出之前所有询问中删除的最大权值。找到对应的状态,输出答案。
【代码】:首先没时间,其次没太懂。。。
Jzzhu and Cities(CF449B)

一个国家有n座城市,其中1号城市是首都。
这个国家有m条无向道路,每条道路有一个权重。
这个国家还有K条火车线路,每条从1到一个其它城市,每条道路有一个相应的权重。
现在我们想删除尽可能多的火车线路,使得从1到其他城市最短路不变。
【思路】:
首先这道题,要找出到每个城市的最小值,之后我们就来判断一下火车道路是否能够删除,由于这条火车道是由1到某个节点的,所以我们只需要判断这个节点到1的最短路是不是从必须要从火车道经过,如果不是,就可以删除,那么我们随便考虑一个节点i,此时我们已经知道了此时的最短距离是dis[i],与i相连的节点v中,如果dis[i] = dis[v] + e[i].w;那么我们可以知道,这个点是由v这个点转移来的,并不是火车车道(即使这个点与1直接相连也没关系,因为1.这条边比火车车道短。那么dis[i] = e[i].w,dis[1] = 0,所以满足情况,2.一样长,那么同1,这条火车道也能删,3.比火车车道长,那么就不满足上述的删除边的条件,所以此车道不能删),那么怎么枚举呢?对于每一个点,我们观察这个点能不能不用那条火车线路达到最短路。我们只要枚举非火车线路的边。假设这点是u,边的另一边是v,边的权重是w。用d[i]表示从1到i的最短路。只需要检查d[v]+w=d[u]即可。这要有一条边使得这个等式成立,我们就可以删掉和u关联的所有火车线路。
【代码】:。。。。。。。。。。。。。。

ExplorationHDU5222

给出一张既有有向边又有无向边的混合图,问是否存在一条从1到1,且每个点至少经过一次的路径??(不过好像大神把题记错了于是我们来一个网上找的)直接按照样例来说:有t组数据,每组数据有n,m1,m2,n代表有n个点,m1代表有m1条无向边,m2代表有有m2条有向边,一条边只能走一次(也就是题上说的走过之后路会坍塌)如果有两个1 2 ,1 2 代表1和2之间有两条边

首先对于所有的无向边,我们使用并查集将两边的点并起来
若一条边未合并之前,两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为这两个点处于同一个并查集集合中,那么它们之间至少存在一条路径)
如果上一步没有判断出环,那么仅靠无向边是找不到环的
考虑到,处于同一个并查集集合中的点之间必定存在一条路径互达,因此将一个集合的点合并之后,原问题等价于在新生成的有向图中是否有环
我们知道,有向无环图必定存在拓扑序,因此只需使用拓扑排序判定即可
时间复杂度O(N+M1+M2) 
 可是为什么大神思维总是那么复杂,为什么不能把无向边赋为双向有向边,这样子再来一个判重就对了~~~~不知道是不是这个办法不可行,有待考证。。。。
Tricks Device(HDU5294)

给出一个n个点m条边的无向图,在不改变1到n的最短路的情况下,最多能删除多少条边?【注,此题相对原题删了第二小问】
【思路】:
刚开始一看这道题很简单,只要跑一遍最短路,记录路径,然后把不在路径上的边删除就是了嘛,然而这样在数据弱的情况下有可能骗到分,为什么说是错的呢,可以看图:

图中有两条最短路,1-2-3-4和1-4,显然1-4更优,那么我们在求最短路时怎么判断呢,显然不好判断(当然你足够强的话也许可以写),这里有两种思路:
一:
我们将边权乘以一个极大值m,再加1,这样并不改变结果,但这样我们就能判断出最优的走法,这样的话在求上图的最短路时就是3*m+3和3*m+1来比较,就可以选出最优的了。
二:
这个是大神给的正解:
先预处理出从1到所有点的最短路以及从n到所有点的最短路。我们要处理出一个DAG(有向无环图),使得在这个图上所有从1到n的路径都是一条从1到n的最短路。处理方法如下,用d1[i]表示1到i的最短路,用d2[i]表示i到n的最短路。对于一条边从u到v权为w。如果:d1[u]+w+d2[v]=d1[n]就把它加入到这个DAG中,求出DAG后将DAG中的边权都设为1,那么我们再求一次最短路,由于边权设为了1,那么最短路的值就是必须的边数,用总边数-这个值就是我们要的答案。
【代码】:不要想了。。。。。。。。。。。。。。。。。。。。。。
Gas Transportation(Gym100492G)
有一个运输天然气的管道系统。这个系统可以视为一个无向图。每条边每个月可以运输1个单位的天然气。
每一条边都有一个拥有者,对于第i条边,这个拥有者会得到每月wi的报酬。
这市场上,每运送1单位的天然气,就能得到c的报酬。如果存在一个边的集合。只用这个集合的边就能从1到n运送f的天然气。如果cf严格大于这些边的权值之和,那么这些边的拥有者就会从这个集合中独立出来。
问存不存在这样的边集合,如果存在输出任意一个这样的集合。
【思路】:
其实这道题是这里面最简单的一道题!!!!然而我们还是被坑了好久,因为什么呢,我们在担心假如一个集合不能独立,另一个集合也不能独立,但这两个集合合起来就能独立怎么办?然而这种担心是多余的,为什么呢?我们考虑这种情况:首先一个集合不能独立,那么cf1 <= wi1 + wi2 + wi3 + ..... + wi;同理,第二个集合cf2 <= wj1 + wj2  +wj3 + ..... + wj,以下若还有其他集合同理,根据不等式的性质:cf1 + cf2 <= wi1 + wi2 +wj1 + wj2 + ...... + wi + wj,也就是说,如果一个集合不独立,那么他和任意多的不能独立的集合联合起来也不能独立,于是问题就变成了直接求最短路的问题了,然后输出路径就可以了。。
【代码】:总算遇到自己能写的一道题了,然而还是没时间。。。话说我连这道题都搜不到好不好!!!!!!
【感想2】:这才只把第二天的图论整理完,还有第一天的dp和线段树,今天还有dp的优化,天哪,好多事啊!!!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值