【题解】P1407国家集训队稳定婚姻

【题解】[P1407 国家集训队]稳定婚姻

很好的一道建模+图论题。

婚姻关系?很像二分图匹配呀,不过不管怎么办先建模再说。婚姻关系显然用图方面的知识解决。建图!

它给定的是字符串,所以我们使用\(ac\)自动机\(map\)作匹配建点。

题意就是给你\(n\)对夫妻关系和\(m\)对情人关系,已知情人关系都可以结婚,现在假设对于某个婚姻,如果离婚,这\(2n\)个人最终依然能够结合成\(n\)对情侣,那么这样的婚姻是不稳定的。现在问每个婚姻关系的稳定性。

考虑什么样的婚姻关系是不稳定的。题目给的意思是,"这\(2n?\)个人最终依然能够结合成\(n?\)对情侣",我们仔细分析一下,发现如下性质:

  • 依然结合成\(n\)对情侣,和这对情侣没有任何间接或直接关系的人可以忽略。\((*)\)
  • 假设有两对婚姻,加入他们的男方女方分别互为情人关系,这两对婚姻都不稳定。\((**)\)

根据以上两点,我们发现,假若婚姻\(a?\)的一个成员喜欢婚姻\(b?\)的一个成员,那么相当于婚姻\(a?\)和婚姻\(b?\)连接了半条边。假若婚姻\(a?\)的另一个成员也喜欢\(b?\)的另一个成员那么又连了半条边。假设两个婚姻最终形成了一条边,那么他们就不稳定了!

我们考虑令情人中全是女孩子喜欢男孩子(谁叫我是男\(oier\)呢)(笑),婚姻中都是互相连边,那么假设有一个强联通分量里有偶数个人,(且不是偶数不是二),那么在这个强联通分量里的婚姻就是不稳定的。

讲不清楚QAQ直接上代码吧。

#include<bits/stdc++.h>

using namespace std;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >

TMP inline ccf qr(ccf b){
    char c=getchar();
    int q=1;
    ccf x=0;
    while(c<48||c>57)
    q=c==45?-1:q,c=getchar();
    while(c>=48&&c<=57)
    x=x*10+c-48,c=getchar();
    return q==-1?-x:x;
}

const int maxn=4004<<1;
map < string ,int > mp;
int n,m;
struct E{
    int to,nx;
}e[(maxn<<1)+(20001<<1)];
int cnt;
int head[maxn];
bool in[maxn];
int dfn[maxn];
int low[maxn];
int stk[maxn];
int be[maxn];
int siz[maxn];
int timer;
int qaq;
int top;

void dfs(int now){
    stk[++top]=now;
    in[now]=1;
    dfn[now]=low[now]=++timer;
    ERP(t,now){
    if(!dfn[e[t].to]){
        dfs(e[t].to);
        low[now]=Min(low[now],low[e[t].to]);
    }
    else
        if(in[e[t].to])
        low[now]=Min(low[now],dfn[e[t].to]);
    }
    if(dfn[now]==low[now]){
    qaq++;
    register int temp;
    do{
        temp=stk[top--];
        in[temp]=0;
        be[temp]=qaq;
        ++siz[qaq];
    }while(top&&temp!=now);
    }
}

inline void add(int fr,int to,bool f){
    e[++cnt]=(E){to,head[fr]};
    head[fr]=cnt;
    if(f)
    add(to,fr,0);
}

int mapcnt;
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    string t1,t2;
    n=qr(1);
    RP(t,1,n){
    cin>>t1>>t2;
    mp[t1]=++mapcnt;
    mp[t2]=++mapcnt;
    add(mapcnt,mapcnt-1,1);
    }
    m=qr(1);
    RP(t,1,m){
    cin>>t1>>t2;
    add(mp[t1],mp[t2],0);
    }
    RP(t,1,mapcnt)
    if(!dfn[t])
        dfs(t);
    RP(t,1,n){
    if((siz[be[t<<1]]&1)||siz[be[t<<1]]==2)
        puts("Safe");
    else
        puts("Unsafe");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/10357887.html

时间: 2024-11-02 08:21:56

【题解】P1407国家集训队稳定婚姻的相关文章

LUOGU P1407 [国家集训队]稳定婚姻

传送门 解题思路 让所有夫妇之间连男到女的边,所有情人之间连女到男的边,然后用$tarjan$,如果对于一对夫妻在强连通分量里,那么就是不稳定的,因为他们可以绕一圈. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> using namespace std; const int MAXN = 8005; const int MA

【题解】[国家集训队]Crash的数字表格 / JZPTAB

求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\). 有\(lcm\left ( i,j \right )=\frac{ij}{gcd\left ( i,j \right )}\), 所以原本的式子转化为:\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}\frac{ij}{gcd\left ( i,j \right )}\). 注意到\(i, j\) 均为 \(gcd\left ( i,j \right

luogu P1407 稳定婚姻-tarjan缩点

题目背景 原<工资>重题请做2397 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到两个月就离婚,是典型的“闪婚闪离”例子,而离婚的导火线是两个人争玩电脑游戏,丈夫一气之下,把电脑炸烂. 有社会工作者就表示,80后求助个案越来越多,有些是与父母过多干预有关.而根据民政部的统计,中国离婚五大城市首位是北京,其次是上海.深圳,广州和厦门,那么到底

【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)

[算法]莫队 [题解] BZOJ 2038 2009国家集训队 小Z的袜子(hose) 莫队算法 莫队--讲稿? 施工中--

国家集训队2011]happiness(吴确)

1873. [国家集训队2011]happiness(吴确) ★★★   输入文件:nt2011_happiness.in   输出文件:nt2011_happiness.out   简单对比时间限制:1 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,

bzoj 2038 [2009国家集训队]小Z的袜子(hose) 莫队算法

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10239  Solved: 4659[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命--具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两

kyeremal-bzoj2038-[2009国家集训队]-小z的袜子(hose)-莫队算法

bzoj2038-[2009国家集训队]-小z的袜子(hose) F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  Manacher Logout 捐赠本站 Notice:省选季快乐&另求历年World Final数据,谢谢&OJ试题突破3000大关! 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 

[国家集训队2011]happiness(吴确) (最小割)

2017-08-09 19:03:49 [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大. [输入格式] 第一行两个正整数n,m.接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行

BZOJ2140: 稳定婚姻

题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v],那么说明v到u有通路,我们把v-u的路以及u-v这条边全部反色,也就是匹配->非匹配,非匹配->匹配.同样还是最大匹配.这说明该边是可行的. 如果该边满流&&scc[u]!=scc[v],那么该边是必须边. 因为如果去掉这条边,最大匹配会减少1(想想看),所以该边必须出现在最大