posts - 14,  comments - 11,  trackbacks - 0

没什么好说的,直接匈牙利算法

#include<iostream> 
using namespace std;
int n,m;//n为x集合,m为y集合 
int map[305][305];//map[x][y]表示x,y两点之间有边相连 
bool visit[305];//记录m中的i节点是否被访问过 
int link[305];//记录当前n中的i节点是否与 j节点相连 
bool dfs(int a)
{
     
int i;
     
for (i=1;i<=n;i++)
     {
         
if (map[a][i]&&!visit[i])
         {
            visit[i]
=true;
            
if (link[i]==0||dfs(link[i]))
            {
               link[i]
=a;
               
return true;
            }
         }
     }
     
return false;
}
int find()
{
     
int sum=0;
     
for (int i=1;i<=n;i++)
     {
         memset(visit,
0,sizeof(visit));
         
if (dfs(i))sum++;
     }
     
return sum;//最大匹配数 
}
int main()
{
    
int t,i,j,k,x;
    
while (scanf("%d%d",&n,&m)!=EOF)
    {
          memset(map,
0,sizeof(map));
          memset(link,
0,sizeof(link));
          
for (i=1;i<=n;i++)
          {
              scanf(
"%d",&j);
              
for (k=1;k<=j;k++)
              {
                  scanf(
"%d",&x);
                  map[i][x]
=1;
              }  
          }
          cout
<<find()<<endl;
    }
return 0;
}
posted on 2011-04-04 09:50 路修远 阅读(1235) 评论(0)  编辑 收藏 引用 所属分类: 路修远

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年4月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

转载,请标明出处!谢谢~~

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

  • 1. re: HDU 2433 最短路
  • @test
    的确这组数据应该输出20的
  • --YueYueZha
  • 2. re: HDU 2433 最短路
  • 这方法应该不对。 看下面这组数据
    4 4
    1 2
    2 3
    3 4
    2 4

    画个图,删去最后一条边 2 4 后的结果应该是20,但是此方法的输出是19
  • --test
  • 3. re: HDU 2433 最短路
  • ans = ans + sum_u + sum_v - sum[u] - sum[v],
    这个公式不是很理解啊,不知道博主怎么想的啊,谢谢咯
  • --姜
  • 4. re: HDU 2433 最短路
  • @attacker
    the i-th line is the new SUM after the i-th road is destroyed
  • --路修远
  • 5. re: HDU 2433 最短路
  • 你这样可以AC????删除<U,V>不仅改变 u,v最短路啊、、、求解
  • --attacker

阅读排行榜

评论排行榜