您的位置:首页 > 理论基础 > 计算机网络

[Loj]#6002. 「网络流 24 题」最小路径覆盖

2017-07-09 23:25 411 查看
题意如题名,最小路径覆盖。

答案为点数减去最大匹配。

用匈牙利直接跑。

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=205;
int n,m;
int map

;
int fr
;
int vis
;
int sum;
int in
;
int le;
int fa
;
vector <int > path
;
int get(int x)
{
return x==fa[x]?x:fa[x]=get(fa[x]);
}
void me(int x,int y)
{
int fx=get(x),fy=get(y);
fa[fx]=fy;
}
bool find(int x)
{
for (int i=1;i<=n;i++)
{
if (map[x][i]&&!vis[i])
{
vis[i]=1;
if (!fr[i]||find(fr[i])) {fr[i]=x;return 1;}
}
}
return 0;
}
int main()
{
register int i,j;
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
map[x][y]=1;
}
for (i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if (find(i)) sum++;
}
//memset(vis,0,sizeof(vis));
for (i=1;i<=n;i++) fa[i]=i;
for (i=1;i<=n;i++)
{
if (fr[i])
if (fa[i]!=fa[fr[i]]) me(i,fr[i]);
}
for (i=1;i<=n;i++)
{
path[fa[i]].push_back(i);
}
for (i=1;i<=n;i++)
{
if (path[i].size())
{
for (j=0;j<path[i].size();j++)
{
printf("%d ",path[i][j]);
}
printf("\n");
}
}
printf("%d",n-sum);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: