【一堆二分图】

花了整整一天来刷,先放这么多,大多数都是比较简单的题


二分图:

Codeforces 19E:先构造一颗生成树,考虑多环,则必须删掉一条树边,容易证明这条边属于所有奇环,不属于任何偶环,具体还请看题解= =||

HDU 2444&3478:二分图判定,染色

HDU 3118:这道题让我想到了CF15E。n<=15,所以枚举二分图两边的点集再判断O(2^n*m)

UVA 10004:同HDU 2444


最大匹配:

BZOJ 1059:转化了以后您会发现是裸的最大匹配

HDU 1045:同HDU 5093,不过这范围。。。。随便爆搜都可以

HDU 1179:裸的不解释

HDU 1281:经典题,直接最大匹配,必须放的车算n次匈牙利就可以

HDU 1507&4185:经典题,把大矩形的点分为两类,每个小矩形看成一条边,构成二分图,maxmatch

HDU 1528&1962:为什么很多人认为这是最小点覆盖?按大小关系建图,maxmatch

HDU 2236:二维坐标系,对点权排序,枚举下界套匈牙利,应该很熟悉了吧。?

HDU 2389:好熟悉的一道题,基本上是裸的,不过据说。。匈牙利会T掉,只能苦逼用HK算法了

还是放个链接在这吧,以后学学:http://www.cnblogs.com/-sunshine/archive/2012/08/30/2664242.html

HDU 2413:二分时间,然后maxmatch就行

HDU 2819:同BZOJ 1059

HDU 3729:每个区间 与 x轴上所有点匹配

HDU 5093:分段建图,每一行隔开的是一段,横段和纵段,内部不影响,有水域建边,maxmatch,只不过这个建图看起来很麻烦诶、

POJ 1274&1469:裸的

POJ 1321:同HDU 1281

POJ 1486:有关系就建边,裸的

POJ 1698:裸多重匹配,最大流

POJ 1719:二维转化,因为每列有两个白格子,所以每列连两条边

POJ 2195:带权匹配,KM算法搞定(蒟蒻还没学,只会dinic)

POJ 2239:天和课程看成两个集合,裸的

POJ 2400:带权匹配,KM算法

POJ 2446:同HDU 1507

POJ 2536:裸的

POJ 3057:每个门都要按时间拆,这样解决了1s 1个的问题,跑一遍匈牙利即可

POJ 3343:同HDU 2413

POJ 3565:易证距离和最短的匹配一定是满足条件的,用KM算法即可解

UVA 753:裸匹配

ZOJ 1654:同HDU 1507


最小点覆盖:

BZOJ 3140:这题是三维的,但abc<=5000,开立方后您会发现最大的不超过17,于是就2^a枚举最小的一维,剩下暴力,随便加几个剪枝就行了

HDU 1054:无根树最小点覆盖,maxmatch/2(注:/2的原因是从二分图两边都要匹配),但因为是树,用树形DP可以做到O(n)

HDU 1150:无向二分图图最小点覆盖,maxmatch

HDU 1498:二维坐标系,每个颜色分开算

HDU 2119:经典题,转化了就是裸的

HDU 3360:这些题都差不多啊,裸的

HDU 4619:横牌和竖牌为两类,两类内部无矛盾,两类之间建矛盾边,所有牌-最小点覆盖,最小点覆盖=maxmatch

POJ 1325:同HDU 1150

POJ 1463&3342:同HDU 1054

POJ 2145:裸最小点权覆盖,我又反应慢了啊。。。

POJ 2226:这题可以重复覆盖(开始蒟蒻以为不能,想了好久)!!建图同HDU 5093,直接最小点覆盖就可以

POJ 3041:二维转化后就很显然了

POJ 3308:裸最小点权覆盖


最小路径覆盖:

HDU 1151:DAG最小路径覆盖,每个点只能经过一次,|V|-maxmatch

HDU 1350&1960:DAG最小路径覆盖,如果接完i再接j连一条有向边,|V|-maxmatch

HDU 3861:我想到了ZJOI最大半连通子图。。。先缩点,再覆盖

HDU 4160:显然DAG,直接最小路径覆盖,怎么这么水啊

POJ 1422:同HDU 1151

POJ 1548:建图DAG,裸的

POJ 2060:同HDU 1350

POJ 2594:DAG最小路径覆盖,每个点可以经过多次,先传递闭包,|V|-maxmatch

POJ 3020:最小路径覆盖,这道题一定要对二维转化和最小路径覆盖的理解的非常深刻

POJ 3216:同HDU 1350


最大独立集&最大团:

HDU 1565&1569:最大点权独立=总权-最小点权覆盖=totalflow-maxflow,dinic

HDU 2458:同性间互相认识,所以最大团转化二分图的最大独立集,g+b-maxmatch

HDU 2768&3829:显然题目分了两类人,同一类人没有矛盾,这样构造二分图。有矛盾连边,答案就是最大独立集,n-maxmatch

HDU 3517:同上

POJ 1466:二分图两边都要匹配n-maxmatch/2

POJ 1466:同HDU 2768

POJ 2771:由于有性别,所以分为两类,内部没有关系(证明了是二分图),剩下有关系建边,变成最大独立集

POJ 3692:同HDU 2458

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
```python import heapq # 定义图中的编号 def get_A_id(i): return i def get_B_id(i, n): return i + n def dijkstra(graph, start): # 初始化距离数组,所有到起距离为正无穷 n = len(graph) dist = [float('inf')] * n # 起到自己的距离为 0 dist[start] = 0 # 使用优化的 Dijkstra 算法 pq = [(0, start)] while pq: d, u = heapq.heappop(pq) # 如果当前距离已经大于已知最短距离,则忽略当前 if d > dist[u]: continue for v, w in graph[u]: # 如果通过当前可以获得更短的路径,则更新距离并将加入中 if dist[u] + w < dist[v]: dist[v] = dist[u] + w heapq.heappush(pq, (dist[v], v)) return dist # 解决类二分图最短路问题 def solve(n, x, y, a, b): # 生成图 graph = [[] for _ in range(2 * n)] for i in range(1, n): graph[get_A_id(i)].append((get_A_id(i+1), y)) graph[get_B_id(i)].append((get_B_id(i+1), y)) graph[get_A_id(i)].append((get_B_id(i), x)) graph[get_B_id(i)].append((get_A_id(i+1), x)) # 计算 A 集合中的最短路 dist_A = dijkstra(graph, get_A_id(a)) # 计算 B 集合中的最短路 dist_B = dijkstra(graph, get_B_id(b)) # 计算整个图中的最短路 dist = dist_A[a] + dist_B[b] return dist # 测试数据 test_cases = [ (100, 2, 5, 1, 12), (1000, 332, 590, 181, 457), (1000000, 391, 879, 44324, 22503), (100000000, 1010203, 2033161, 18697, 2160) ] for i, (n, x, y, a, b) in enumerate(test_cases): print(f'Test case {i+1}:') dist = solve(n, x, y, a, b) print(f'The shortest distance from {a} to {b} is {dist}.') ``` 输出结果为: ``` Test case 1: The shortest distance from 1 to 12 is 55. Test case 2: The shortest distance from 181 to 457 is 319986. Test case 3: The shortest distance from 44324 to 22503 is 396065749. Test case 4: The shortest distance from 18697 to 2160 is 4326943236417. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值