[POJ2594]Treasure Exploration(最小路径覆盖变种,floyd算法,匈牙利算法)
2016-08-25 19:37
344 查看
题目链接:http://poj.org/problem?id=2594
题意:给一张图,有单向边。现在要往图上某几个点放几个机器人,机器人要把所有的点都走过,问最少需要放多少个机器人,路径可以重复走。
路径可以重复走,则可以用floyd求出所有可达的点,再做最小路径覆盖,根据公式 最小路径覆盖=节点数-最大匹配直接做二分图最大匹配就可以。
题意:给一张图,有单向边。现在要往图上某几个点放几个机器人,机器人要把所有的点都走过,问最少需要放多少个机器人,路径可以重复走。
路径可以重复走,则可以用floyd求出所有可达的点,再做最小路径覆盖,根据公式 最小路径覆盖=节点数-最大匹配直接做二分图最大匹配就可以。
/* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mind! ┛┗┛┗┛┃\○/ ┓┏┓┏┓┃ / ┛┗┛┗┛┃ノ) ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┃┃┃┃┃┃ ┻┻┻┻┻┻ */ #include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <climits> #include <complex> #include <fstream> #include <cassert> #include <cstdio> #include <bitset> #include <vector> #include <deque> #include <queue> #include <stack> #include <ctime> #include <set> #include <map> #include <cmath> using namespace std; #define fr first #define sc second #define cl clear #define BUG puts("here!!!") #define W(a) while(a--) #define pb(a) push_back(a) #define Rint(a) scanf("%d", &a) #define Rs(a) scanf("%s", a) #define Cin(a) cin >> a #define FRead() freopen("in", "r", stdin) #define FWrite() freopen("out", "w", stdout) #define Rep(i, len) for(int i = 0; i < (len); i++) #define For(i, a, len) for(int i = (a); i < (len); i++) #define Cls(a) memset((a), 0, sizeof(a)) #define Clr(a, x) memset((a), (x), sizeof(a)) #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) #define lrt rt << 1 #define rrt rt << 1 | 1 #define pi 3.14159265359 #define RT return #define lowbit(x) x & (-x) #define onecnt(x) __builtin_popcount(x) typedef long long LL; typedef long double LD; typedef unsigned long long ULL; typedef pair<int, int> pii; typedef pair<string, int> psi; typedef pair<LL, LL> pll; typedef map<string, int> msi; typedef vector<int> vi; typedef vector<LL> vl; typedef vector<vl> vvl; typedef vector<bool> vb; const int maxn = 555; int nu, nv; int G[maxn][maxn]; int linker[maxn]; bool vis[maxn]; bool dfs(int u) { For(v, 1, nv+1) { if(G[u][v] && !vis[v]) { vis[v] = 1; if(linker[v] == -1 || dfs(linker[v])) { linker[v] = u; return 1; } } } return 0; } int hungary() { int ret = 0; Clr(linker, -1); For(u, 1, nu+1) { Cls(vis); if(dfs(u)) ret++; } return ret; } int n, m; int main() { // FRead(); int u, v; while(~Rint(n) && ~Rint(m) && n + m) { Cls(G); nu = nv = n; Rep(i, m) { Rint(u); Rint(v); G[u][v] = 1; } For(k, 1, n+1) { For(i, 1, n+1) { For(j, 1, n+1) { if(G[i][k] + G[k][j] == 2) { G[i][j] = 1; } } } } printf("%d\n", nu - hungary()); } RT 0; }
相关文章推荐
- [POJ2594] Treasure Exploration(最小路径覆盖-传递闭包 + 匈牙利算法)
- POJ3020 无向图的最小路径覆盖 无向图边覆盖 匈牙利算法巩固训练
- 强连通分量(强连通缩点(tarjan))+最小路径覆盖(匈牙利算法)
- poj 3020 Antenna Placement(最小路径覆盖 + 匈牙利算法)
- [网络流24题][CODEVS1904]最小路径覆盖问题(最大流||匈牙利算法)
- hdu1151(二分图+最小路径覆盖数+匈牙利算法)
- POJ 3020 Antenna Placement(匈牙利算法—最小路径覆盖)
- HDOJ---1151 Air Raid[匈牙利算法:最小路径覆盖数=原图顶点数–二分图最大匹配数]
- POJ3020《Antenna Placement》方法:无向图最小路径覆盖 匈牙利算法
- poj 3020 Antenna Placement (最小路径覆盖, 匈牙利算法, 拆点形成二分图)
- 彻底搞定二分图的匈牙利算法,最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖
- HDU 1151 Air Raid 最小路径覆盖,二分图匹配匈牙利算法(邻接表存关系)处理有向图
- 二分图匹配-匈牙利算法, 最小路径覆盖
- POJ-1422-Air Raid-求最小路径覆盖(匈牙利算法)
- HDU 1151 Air Raid(匈牙利算法 二分图的最小路径覆盖 )
- POJ 2594 Treasure Exploration(匈牙利算法—最小路径覆盖 + floyd)
- 洛谷 P2764 最小路径覆盖问题【匈牙利算法】
- 【Floyd】【Dilworth定理】【最小路径覆盖】【匈牙利算法】bzoj1143 [CTSC2008]祭祀river
- POJ 1422 Air Raid(匈牙利算法—最小路径覆盖)
- 匈牙利算法 hdu 1151有向图的最小路径覆盖=顶点数-最大匹配数