【解析】Hash,离散化。Tarjan



[分析]

对于每一个名字。首先离散化成编号。

用hash或者其它,反正不要最主要的即可了。否则O(N^2L)会爆掉。

然后请參考:http://www.cnblogs.com/Randolph87/p/3757817.html



[吐槽]

难得吐槽一下,做这道题居然做了一个上午,開始暴力求标号,然后一直TLE。

中间map的数据范围少开了N,也试过几次WA。

这不是水题吗。为什么会是一个艰难的Accept...



[小结]

求二分图完备匹配的必要边,①存不存在增广环?

O(N^2) ②直接试着删去依照hungery找完备匹配 O(N^3)。

[代码]

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std; typedef unsigned long long ULL;
const int N=8002;
const int M=20001;
const int L=12;
const int T=37;
const int LMT=100009; int n,m;
struct G
{
int v,nxt;
}map[M+N];
int tt,hd[N];
int dfn[N],pre[N],ct;
int edge[N][2];
int v[N],color[N],stk[N],cc;
char t[L];
struct T
{
char s[L];
int nxt;
}hash[N];
int num,hh[LMT]; inline void ins(int u,int v)
{
map[++tt].v=v;
map[tt].nxt=hd[u];
hd[u]=tt;
} void tarjan(int now)
{
dfn[now]=pre[now]=++ct;
stk[++stk[0]]=now,v[now]=1;
for (int k=hd[now];k;k=map[k].nxt)
{
if (v[map[k].v]==2) continue;
if (v[map[k].v]==1)
{
if (pre[map[k].v]<dfn[now]) dfn[now]=pre[map[k].v];
continue;
}
tarjan(map[k].v);
if (dfn[map[k].v]<dfn[now]) dfn[now]=dfn[map[k].v];
}
if (pre[now]==dfn[now])
{
cc++;
for (;stk[stk[0]]!=now;stk[0]--)
color[stk[stk[0]]]=cc,v[stk[stk[0]]]=2;
color[stk[stk[0]]]=cc; v[stk[stk[0]--]]=2;
}
} inline ULL h(void)
{
ULL sum=0; int lt=strlen(t);
for (int i=0;i<lt;i++) sum=sum*T+t[i]-'0';
return sum;
} int pos(void)
{
int key=h()%LMT;
for (int k=hh[key];k;k=hash[k].nxt)
if (!strcmp(hash[k].s,t)) return k;
memmove(hash[++num].s,t,sizeof t);
hash[num].nxt=hh[key];
return hh[key]=num;
} int main(void)
{
int t1,t2;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",t); t1=pos();
scanf("%s",t); t2=pos();
edge[i][0]=t1,edge[i][1]=t2;
ins(t1,t2);
}
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
scanf("%s",t); t1=pos();
scanf("%s",t); t2=pos();
ins(t2,t1);
} for (int i=1;i<=n;i++)
if (!v[edge[i][0]]) tarjan(edge[i][0]); for (int i=1;i<=n;i++)
printf("%s\n",color[edge[i][0]]==color[edge[i][1]]?"Unsafe":"Safe"); return 0;
}

【BZOJ】2140 稳定婚姻的更多相关文章

  1. BZOJ 2140 稳定婚姻

    2140: 稳定婚姻 Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  2. bzoj 2140: 稳定婚姻 (二分图)

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  3. BZOJ 2140 稳定婚姻 ——二分图

    论二分图的可行边与必须边. 考虑用dinic增广之后的图,一些是必要的割边,一些是可行的割边. 我们首先求出一组可行的最大匹配,那么这些变都是可行的. 然后我们求一遍强连通分量. 如果 scc[u]! ...

  4. 2140: 稳定婚姻 - BZOJ

    Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就 ...

  5. BZOJ2140: 稳定婚姻

    题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...

  6. BZOJ2140: 稳定婚姻(tarjan解决稳定婚姻问题)

    2140: 稳定婚姻 Time Limit: 2 Sec  Memory Limit: 259 MBSubmit: 1321  Solved: 652[Submit][Status][Discuss] ...

  7. [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)

    3816: 矩阵变换 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 803  Solved: 578[Submit][Status][Discuss] ...

  8. 【HDU1914 The Stable Marriage Problem】稳定婚姻问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1914 题目大意:问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序, ...

  9. UVA 1175 Ladies' Choice 稳定婚姻问题

    题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...

随机推荐

  1. 【专题系列】单调队列优化DP

    Tip:还有很多更有深度的题目,这里不再给出,只给了几道基本的题目(本来想继续更的,但是现在做的题目不是这一块内容,以后有空可能会继续补上) 单调队列——看起来就是很高级的玩意儿,显然是个队列,而且其 ...

  2. sql 系统函数

    --查看表备注SELECT a.column_id AS No, a.name AS 列名, isnull(g.[value],'-') AS 说明 FROM sys.columns a left j ...

  3. 基于NPOI的扩展

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.HSS ...

  4. 手动触发dom节点事件代码

    在爬代码过程中,碰到一个稀奇古怪的问题.需要手工修改select的值,然后手动触发select的change事件,但使用网络上查到的通过trigger.onchange()事件触发都不执行,没办法,只 ...

  5. php登陆和注册

    注册界面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  6. js手机移动端选择插件 mobileSelect.js

    一.mobileSelect获取方法 mobileSelect支持单选.多级联动.自定义回调函数.二次渲染.最新版本下载地址[2017-09-21更新]: https://github.com/onl ...

  7. Vuex教程简单实例

    什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性. ...

  8. DD打卡

    一.安装逍遥安卓模拟器 二.安装钉钉 三.设置当前GPS座标 位置模拟器: 链接: https://pan.baidu.com/s/1TC5QkrGAgHOJWtzJnX6vhA 提取码: bpu8 ...

  9. appium的滑动

    #coding = utf-8from appium import webdriverimport time'''1.手机类型2.版本3.手机的唯一标识 deviceName4.app 包名appPa ...

  10. js中获取数组中的最大值最小值

    var a=[1,2,3,5]; alert(Math.max.apply(null, a));//最大值 alert(Math.min.apply(null, a));//最小值 多维数组可以这么修 ...