codevs 1222 信与信封问题

/*
二分图
题目给出的是确定不连通的边
如果我们剩下的可能联通也可能不连通的
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 210
using namespace std;
int n,num,head[maxn],g[maxn][maxn],ans,f[maxn],match[maxn],sum,ei;
struct Ans
{
    int x,y;
}an[maxn*maxn];
struct node
{
    int u,v,pre;
}e[maxn*maxn];
int cmp(const Ans &a,const Ans &b)
{
    return a.x<b.x;
}
int init()
{
    int x=0;char s=getchar();
    while(s<‘0‘||s>‘9‘)s=getchar();
    while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
    return x;
}
void Add(int from,int to)
{
    num++;
    e[num].u=from;
    e[num].v=to;
    e[num].pre=head[from];
    head[from]=num;
}
int Dfs(int k)
{
    for(int i=head[k];i;i=e[i].pre)
      if(f[e[i].v]==0&&i!=ei)
        {
          f[e[i].v]=1;
          if(match[e[i].v]==0||Dfs(match[e[i].v]))
            {
              match[e[i].v]=k;
              return 1;
            }
        }
    return 0;
}
int main()
{
    n=init();
    int u,v;
    while(1)
      {
          u=init();v=init();
          if(u==0&&v==0)break;
          g[u][v]=1;
      }
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        if(g[i][j]==0)Add(i,j);
    for(int i=1;i<=n;i++)
      {
          memset(f,0,sizeof(f));
          ans+=Dfs(i);
      }
    if(ans!=n)
      {
          printf("none\n");
          return 0;
      }
    for(int i=1;i<=num;i++)
      {
          memset(match,0,sizeof(match));
          ans=0;
          for(int j=1;j<=n;j++)
          {
            memset(f,0,sizeof(f));
            ei=i;
            ans+=Dfs(j);
          }
        if(ans!=n)
          {
              sum++;
              an[sum].x=e[i].u;
              an[sum].y=e[i].v;
          }
      }
    if(sum==0)
      {
          printf("none\n");
          return 0;
      }
    sort(an+1,an+1+sum,cmp);
    for(int i=1;i<=sum;i++)
      printf("%d %d\n",an[i].x,an[i].y);
    return 0;
}
时间: 2024-10-12 19:58:52

codevs 1222 信与信封问题的相关文章

codevs 1222 信与信封问题(二分图的完美匹配)

1222 信与信封问题 题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封.不幸的是,Small John无法将拿出的信正确地装回信封中了. 将Small John所提供的n封信依次编号为1,2,…,n:且n个信封也依次编号为1,2,…,n.假定Small John能提供一组信息:第i封信肯定不是装在信封j中.请编程帮助Small John,尽可能多地将信正确地装回信封. 输入

WIKIOI 1222信与信封问题

题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封.不幸的是,Small John无法将拿出的信正确地装回信封中了. 将Small John所提供的n封信依次编号为1,2,…,n:且n个信封也依次编号为1,2,…,n.假定Small John能提供一组信息:第i封信肯定不是装在信封j中.请编程帮助Small John,尽可能多地将信正确地装回信封. 输入描述 Input Des

codevs1222 信与信封问题

1222 信与信封问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封.不幸的是,Small John无法将拿出的信正确地装回信封中了. 将Small John所提供的n封信依次编号为1,2,…,n:且n个信封也依次编号为1,2,…,n.假定Small John能提供一组信息:第i封信肯

codevs1222 信与信封的问题

题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封.不幸的是,Small John无法将拿出的信正确地装回信封中了. 将Small John所提供的n封信依次编号为1,2,…,n:且n个信封也依次编号为1,2,…,n.假定Small John能提供一组信息:第i封信肯定不是装在信封j中.请编程帮助Small John,尽可能多地将信正确地装回信封. 输入描述 Input Des

CODEVS1222 信与信封问题 (匈牙利算法)

先做一遍匈牙利算法.对于已经匹配的边,如果删去之后还能最大匹配数增加,则不符合要求. 一遍匈牙利算法是O(n^3)的,对于每一条边做n次,每次O(n^2),总的复杂度是O(n^3). 注意:不要忘记输出none. 1 var a:array[0..1000,0..1000] of boolean; 2 l,r:array[0..1000] of longint; 3 pd:array[0..1000] of boolean; 4 i,j,x,y,n,sum,num:longint; 5 func

codevs 必做:2776、1222

2776 寻找代表元 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用1到n编号.广州二中苏元实验学校一共有m个人,分别用1到m编号.每个人可以参加一个或多个社团,也可以不参加任何社团.每个社团都需要选一个代表.谦哥希望更多的人能够成为代表. 输入描述 Input Description 第一行输入两个数n和m.以下n行每行若干个数,这些数都是不超过m的正整数.其中第i行的数表示社

小结:二分图匹配

概要: 可以用匈牙利或者网络流(听说Dinic是O(sqrt(V)*E),isap我不知道,大概一样吧.) 应用: 最大匹配.最小点覆盖.最大独立集.最小路径覆盖.二分图完美匹配等. 技巧及注意: 匈牙利是O(nm)的,比网络流慢. KM比网络流慢. (还是写网络流吧...) 在X集和Y集元素不同时,又要求哪些X集中元素有且只有一个Y集中的元素与之匹配时,可以先跑二分图匹配,然后依次删边,看是否还能继续匹配,如果不能就是一个答案.例如:[wikioi]1222 信与信封问题(二分图+特殊的技巧)

CodeVS 1697-⑨要写信

原题 题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因-- 琪露诺的符卡 冰符"Icicle Fall"-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你: ZUN在<红魔乡>中介绍她时已经说她有点笨笨的了: 在ZUN放出<东方花映冢>的介绍图时,在图中把琪露诺放在了⑨的位置上,并以"⑨笨蛋"简单带过,从此"

⑨要写信(codevs 1697)

题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因…… 琪露诺的符卡 冰符“Icicle Fall”-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你: ZUN在<红魔乡>中介绍她时已经说她有点笨笨的了: 在ZUN放出<东方花映冢>的介绍图时,在图中把琪露诺放在了⑨的位置上,并以“⑨笨蛋”简单带过,从此“⑨”及“笨蛋”就成为她的别名了…… 所以琪露诺便得到了