您的位置:首页 > 其它

HDU1151最小路径覆盖

2016-03-13 14:55 190 查看
DAG图(无回路有向图)的最小路径覆盖

用尽量少的不相交简单路径覆盖有向无环图(DAG)的所有顶点,这就是DAG图的最小路径覆盖问题。

最小路径覆盖数 = 节点数- 最大匹配数

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int MAXN=200;
int linker[MAXN];
int g[MAXN][MAXN];
int used[MAXN];
int n;

int dfs(int u)
{
for(int v=1;v<=n;v++)
{
if(g[u][v]&&!used[v])
{
used[v]=1;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return 1;
}
}
}
return 0;
}

int hungary()
{
int res=0;
memset(linker,-1,sizeof(linker));
for(int u=1;u<=n;u++)
{
memset(used,0,sizeof(used));
if(dfs(u))
res++;
}
return res;
}
int main()
{int t,k,a,b;
cin>>t;
while(t--)
{
memset(g,0,sizeof(g));
cin>>n>>k;
while(k--)
{
cin>>a>>b;
g[a][b]=1;
}
cout<<n-hungary()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: