luogu 2764 最小路径覆盖问题 | 最大匹配

luogu 2764

最小路径覆盖 = n - 最大匹配

 1 #include <cstdio>
 2 #include <string>
 3 #include <vector>
 4 #include <queue>
 5 #include <cstring>
 6
 7 const int N = 200, INF = 0x3f3f3f3f;
 8
 9 int read() {
10     int x = 0, f = 1;
11     char c = getchar();
12     while (!isdigit(c)) {
13         if (c == ‘-‘) f = -1;
14         c = getchar();
15     }
16     while (isdigit(c)) {
17         x = (x << 3) + (x << 1) + (c ^ 48);
18         c = getchar();
19     }
20     return x * f;
21 }
22
23 int n, m, matx[N], maty[N], dx[N], dy[N], dis, used[N];
24 std::vector<int> G[N];
25
26 bool bfs() {
27     std::queue<int> Q; dis = INF;
28     memset(dx, -1, sizeof dx);
29     memset(dy, -1, sizeof dy);
30     for (int i = 1; i <= n; ++ i)
31         if (matx[i] == 0) Q.push(i), dx[i] = 0;
32     while (!Q.empty()) {
33         int u = Q.front(); Q.pop();
34         if (dx[u] > dis) break;
35         int size = G[u].size();
36         for (int i = 0; i < size; ++ i) {
37             int v = G[u][i];
38             if (dy[v] == -1) {
39                 dy[v] = dx[u] + 1;
40                 if (maty[v] == 0) dis = dy[v];
41                 else dx[maty[v]] = dy[v] + 1, Q.push(maty[v]);
42             }
43         }
44     }
45     return dis != INF;
46 }
47
48 bool dfs(int u) {
49     int size = G[u].size();
50     for (int i = 0; i < size; ++ i) {
51         int v = G[u][i];
52         if (!used[v] && dy[v] == dx[u] + 1) {
53             used[v] = 1;
54             if (maty[v] != 0 && dy[v] == dis) continue;
55             if (maty[v] == 0 || dfs(maty[v])) {
56                 maty[v] = u, matx[u] = v;
57                 return 1;
58             }
59         }
60     }
61     return 0;
62 }
63
64 int match() {
65     int res = 0;
66     while (bfs()) {
67         memset(used, 0, sizeof used);
68         for (int i = 1; i <= n; ++ i) {
69             if (matx[i] == 0 && dfs(i)) ++res;
70         }
71     }
72     return res;
73 }
74
75 int main() {
76     n = read(), m = read();
77     for (int i = 1; i <= m; ++ i) {
78         int u = read(), v = read();
79         G[u].push_back(v);
80     }
81     int tmp = match();
82     for (int i = 1; i <= n; ++ i) {
83         int u = 0;
84         if (!maty[i]) u = i;
85         if (!u) continue;
86         while (u) {
87             printf("%d ", u);
88             u = matx[u];
89         } puts("");
90     }
91     printf("%d\n", n - tmp);
92     return 0;
93 }

原文地址:https://www.cnblogs.com/milky-w/p/8543816.html

时间: 2024-11-07 02:42:59

luogu 2764 最小路径覆盖问题 | 最大匹配的相关文章

BZOJ 2150 部落战争 最小路径覆盖 二分图最大匹配

题目大意:给出一张地图,一个军队要征战整个土地.一块土地只能经过一次,有X的地方不能走,军队只会走R*C个格子,只会向下走,问最少需要多少军队能够征战所有的土地. 思路:这个是前几天考试的题,今天居然发现时BZ的原题,还好当时A掉了... 看到每个土地只能经过一次就想到了网络流什么的,再一想想好像是最小路径覆盖啊,然后拆点,建图,Hungary,二分图最小路径覆盖=点数-最大匹配,没了.. CODE: #include <cstdio> #include <cstring> #in

poj 2594 Treasure Exploration(最小路径覆盖/二分最大匹配)

Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 7208   Accepted: 2944 Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored

洛谷2764 最小路径覆盖问题

问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖. 编程任务: 对于给定的给定有向无环图G,编程找出G的一个最小路径覆盖. Input Format 文件第1 行有2个正整数n和m.n是给定有向无环图G 的顶点数,m是

luogu P2764 最小路径覆盖问题

DAG的最小不相交路径覆盖板子 #include<bits/stdc++.h> using namespace std; int ans=0,len=0,lin[500],din[50000],dout[50000],level[500],x,y,S,T,n,m,q[500]; int q1[500],q2[500],tail1=0,tail2=0; bool f[500]; struct one { int x,y,v,next,reverse; }; one e[30000]; void

最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

在讲述这两个算法之前,首先有几个概念需要明白: 二分图: 二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A, j in B), 则称图G是二分图. 匹配: 给定一个二分图,在G的一个子图G'中,如果G'的边集中的任意两条边都不依附于同一个顶点,则称G'的边集为G的一个匹配 最大匹配: 在所有的匹配中,边数最多的那个匹配就是二分图的最大匹

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

POJ_3020_最小路径覆盖

Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8718   Accepted: 4327 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobile phone nets in Sweden. The most st

POJ 2060 Taxi Cab Scheme【最小路径覆盖】

T - Taxi Cab Scheme Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2060 Appoint description:  System Crawler  (2014-08-22) Description Running a taxi station is not all that simple. Apart from

POJ_2594_最小路径覆盖

Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8085   Accepted: 3303 Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored