poj2594匈牙利算法+邻接表+传递闭包
2014-02-13 17:05
204 查看
题意:给你一个有向图,求最大路覆盖数,但是点可以重复;
解题思路:这题跟hdu 1054的不同之处是可以走重复的点,那么我们就可以这样想,假如这个点会被走重,那么我们就加一条边去跨过这个点,那么当这个点的相邻点集中,任意两个不相邻的点也能在匈牙利算法中得到匹配,最后在这个改造后的图中求最大路径覆盖数,就果断ac了
891msG++代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int mj[502][502];
int flag[502],result[502];
int n,m,k;
bool find(int i)
{
int j;
for(j=0;j<n;j++)
{
if(mj[i][j]!=0&&flag[j]==0)
{
flag[j]=1;
if(result[j]==0||find(result[j]))
{
result[j]=i;
return true;
}
}
}
return false;
}
void floyd()
{
int k,i,j;
for ( k = 0; k < n; k++)
for ( i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i != j && mj[i][k]==1 && mj[k][j]==1)
mj[i][j] = 1;
}
int main()
{
int i,ans,x,y;
while(scanf("%d %d",&n,&m),n||m)
{
memset(result,0,sizeof(result));
memset(mj,0,sizeof(mj));
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
x--;
y--;
mj[x][y]=1;
}
ans=0;
floyd();
for(i=0;i<n;i++)
{
memset(flag,0,sizeof(flag));
if(find(i)) ans++;
}
printf("%d\n",n-ans/2);
}
return 0;
}
解题思路:这题跟hdu 1054的不同之处是可以走重复的点,那么我们就可以这样想,假如这个点会被走重,那么我们就加一条边去跨过这个点,那么当这个点的相邻点集中,任意两个不相邻的点也能在匈牙利算法中得到匹配,最后在这个改造后的图中求最大路径覆盖数,就果断ac了
891msG++代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int mj[502][502];
int flag[502],result[502];
int n,m,k;
bool find(int i)
{
int j;
for(j=0;j<n;j++)
{
if(mj[i][j]!=0&&flag[j]==0)
{
flag[j]=1;
if(result[j]==0||find(result[j]))
{
result[j]=i;
return true;
}
}
}
return false;
}
void floyd()
{
int k,i,j;
for ( k = 0; k < n; k++)
for ( i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i != j && mj[i][k]==1 && mj[k][j]==1)
mj[i][j] = 1;
}
int main()
{
int i,ans,x,y;
while(scanf("%d %d",&n,&m),n||m)
{
memset(result,0,sizeof(result));
memset(mj,0,sizeof(mj));
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
x--;
y--;
mj[x][y]=1;
}
ans=0;
floyd();
for(i=0;i<n;i++)
{
memset(flag,0,sizeof(flag));
if(find(i)) ans++;
}
printf("%d\n",n-ans/2);
}
return 0;
}
相关文章推荐
- nyoj 239 月老的难题(匈牙利算法+邻接表)
- nyoj239 月老的难题 (匈牙利算法,最大匹配,邻接表)
- HDU - 1150 Machine Schedule 最小点覆盖(最大二分图匹配-匈牙利算法)邻接表写法
- 算法结点图的多源点最短路问题和传递闭包之Floyd-Warshall算法 By ACReaper
- ural 1109,NYOJ 239,匈牙利算法邻接表
- 过山车 邻接表 匈牙利算法
- 匈牙利算法 && EK(邻接表)
- 算法导论 第二十五章:有向图的传递闭包
- 【邻接表+匈牙利算法模板】Elementary Math
- [POJ2594] Treasure Exploration(最小路径覆盖-传递闭包 + 匈牙利算法)
- nyoj 239 月老的难题【匈牙利算法+邻接表】
- 小白算法练习 hdu courses 1083 匈牙利算法 dfs 邻接矩阵 vector模拟邻接表
- poj2594最小顶点覆盖+传递闭包
- hdu1151匈牙利算法邻接表
- 动态规划:利用WarShell算法求有向图的传递闭包
- HDU 1151 Air Raid 最小路径覆盖,二分图匹配匈牙利算法(邻接表存关系)处理有向图
- hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)
- [POJ2594]Treasure Exploration(最小路径覆盖变种,floyd算法,匈牙利算法)
- HDOJ 2063 过山车 ——二分图最大匹配(以邻接矩阵,邻接表为数据结构的匈牙利算法)
- poj 1466 匈牙利算法呀~