【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104696
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

即将到来的会议A国派出M个代表,B国派出N个代表 (M and N <= 1000).A国的代表编号为1, 2, ..., M ;B国的代表编号为1, 2, ..., N .开会前,要选择K对代表。每一对代表必须一个是A国的,一个是B国的。A国的成员i与B国的成员j就可结对(If there exists a pair in which both member #i of A and member #j of B are included then #i and #j can negotiate.???)每一个参加会议的代表至少包含在其中一对中。大会的CEO想在代表的房间建立直接的电话联系。所以每个人都至少跟对方的一个人联系起来。每一个电话联系是在有结对关系的人们之间建立的(every connection is made between people that can negotiate.???如何翻译)。CEO想建立最少的电话联系。

input:
首行给定M,N,K。以下K行为结对的代表P1,P2。P1是A国的成员,P2是B国的成员。

output:
输出所需的最少电话联系。


分析:最小覆盖==总点数-最大匹配数。

【参考程序】:
#include<iostream>
using namespace std;
int n,m,ans;
bool vis[1001],map[1001][1001];
int link[1001];
bool Find(int now)
{
    
for (int i=1;i<=m;i++)
        
if (!vis[i] && map[now][i])
        {
            vis[i]
=true;
            
if (link[i]==0 || Find(link[i]))
            {
                link[i]
=now;
                
return true;
            }
        }
    
return false;
}
int main()
{
    
int p;
    scanf(
"%d%d%d",&n,&m,&p);
    memset(map,
false,sizeof(map));
    
int a,b;
    
for (int i=1;i<=p;i++)
    {
        scanf(
"%d%d",&a,&b);
        map[a][b]
=true;
    }
    ans
=0;
    
for (int i=1;i<=n;i++)
    {
        memset(vis,
false,sizeof(vis));
        
if (Find(i)) ans++;
    }
    printf(
"%d\n",n+m-ans);
    
return 0;
}

posted on 2009-07-07 14:07 开拓者 阅读(283) 评论(0)  编辑 收藏 引用 所属分类: URAL 题解

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