捉迷藏(二分图,最小路径重复覆盖)

编程入门 行业动态 更新时间:2024-10-24 09:23:57

捉迷藏(二分图,最小<a href=https://www.elefans.com/category/jswz/34/1771438.html style=路径重复覆盖)"/>

捉迷藏(二分图,最小路径重复覆盖)

最小路径覆盖:用最少互不相交的路径,将点全部覆盖。

最小路径重复覆盖:用最少多少条路径覆盖所有点,路径可以有公共点和公共边。

在二分图中:最小路径覆盖=总点数-最大匹配数。在DAG图G中的最小路径重复覆盖==在他的传递闭包图G’中的最小路径覆盖。

代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define SIS std::ios::sync_with_stdio(false)
#define space putchar(' ')
#define enter putchar('\n')
#define lson root<<1
#define rson root<<1|1
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
const int mod=100003;
const int N=1e5+5;
const int inf=0x7f7f7f7f;int gcd(int a,int b)
{return b==0?a:gcd(b,a%b);
}ll lcm(ll a,ll b)
{return a*(b/gcd(a,b));
}template <class T>
void read(T &x)
{char c;bool op = 0;while(c = getchar(), c < '0' || c > '9')if(c == '-')op = 1;x = c - '0';while(c = getchar(), c >= '0' && c <= '9')x = x * 10 + c - '0';if(op)x = -x;
}
template <class T>
void write(T x)
{if(x < 0)x = -x, putchar('-');if(x >= 10)write(x / 10);putchar('0' + x % 10);
}
ll qsm(int a,int b,int p)
{ll res=1%p;while(b){if(b&1)res=res*a%p;a=1ll*a*a%p;b>>=1;}return res;
}int head[N],nex[N],to[N];
int n,m;
int color[N];
int g[205][205];
int match[205];
int vis[205];bool fnd(int x)
{for(int i=1;i<=n;i++){if(!vis[i]&&g[x][i]){vis[i]=1;int t=match[i];if(t==0||fnd(t)){match[i]=x;return true;}}}return false;
}
int main()
{scanf("%d%d",&n,&m);while(m--){int a,b;scanf("%d%d",&a,&b);g[a][b]=1;}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(g[i][k]&&g[k][j]) g[i][j]=1;int res=0;for(int i=1;i<=n;i++){memset(vis,0,sizeof vis);if(fnd(i)) res++;}printf("%d\n",n-res);return 0;}

更多推荐

捉迷藏(二分图,最小路径重复覆盖)

本文发布于:2024-02-17 11:01:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1693770.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:路径   最小

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!