洛谷

这个题面很有意思,像我这样的菜鸡,完全不需考虑婚姻的稳定 问题。

tarjan裸题,直接讲算法吧:

原配夫妻之间分别连一条边,小情人之间反向连边。

这时候我们会发现一个性质,如果婚姻稳定,那么夫妻之间肯定不在一个强连通分量中,反之,在一个强连通分量中的夫妻就是Unsafe的。

代码:

#include <bits/stdc++.h>
using namespace std; stack <int> ss;
const int N=200010;
map <string,int> mp;
int n,m,s[N][2],o[N],cnt;
int low[N],dfn[N],dfscnt,scc,sccno[N]; void add(int x,int y)
{
s[++cnt][0]=y;
s[cnt][1]=o[x];
o[x]=cnt;
} void tarjan(int x)
{
ss.push(x);
low[x]=dfn[x]=++dfscnt;
for (int i=o[x];i;i=s[i][1]) {
if (!dfn[s[i][0]]) {
tarjan(s[i][0]);
low[x]=min(low[x],low[s[i][0]]);
}
else if (!sccno[s[i][0]])
low[x]=min(low[x],dfn[s[i][0]]);
}
if (dfn[x]==low[x]) {
scc++;
while (1) {
int y=ss.top();
sccno[y]=scc;
ss.pop();
if (x==y) break;
}
}
} int main()
{
ios::sync_with_stdio(false);
cin>>n;string a,b;
for (int i=1;i<=n;i++) {
cin>>a>>b;
mp[a]=i;
mp[b]=i+n;
add(i,i+n);
}
cin>>m;
for (int i=1;i<=m;i++) {
cin>>a>>b;
add(mp[b],mp[a]);
}
m=n<<1;
for (int i=1;i<=m;i++)
if (!dfn[i])
tarjan(i);
for (int i=1;i<=n;i++)
if (sccno[i]==sccno[i+n])
cout<<"Unsafe\n";
else cout<<"Safe\n";
return 0;
}

最新文章

  1. ip地址库 新浪,淘宝
  2. cglib源码分析--转
  3. NotePad++相关设置
  4. [杂题]FZU2190 非提的救赎
  5. HeadFirst设计模式之工厂模式
  6. 虚反矩阵指令pinv之应用
  7. charles连接手机抓包
  8. 201521123019 《Java程序设计》第5周学习总结
  9. ICO图标下载地址
  10. Python学习总结 10 自动化测试Selenium2
  11. centos 7 安装appache 服务器
  12. Apache的域名配置
  13. ssl证书生成与验证
  14. C语言/C++编程学习:栈的代码实现之数组方案
  15. learn go error
  16. Spring jar 下载地址
  17. Spring简洁版总结
  18. [bzoj3223]文艺平衡树——splay
  19. ContextMenuStrip 动态添加多级子菜单
  20. CF796C Bank Hacking 思维

热门文章

  1. Python 的数据表示
  2. Spring属性占位符 PropertyPlaceholderConfigurer
  3. 【MyBatis学习14】MyBatis和Spring整合
  4. 学习使用master.dbo.spt_values表
  5. sublime text 3 修改侧边栏字体
  6. MySQL 使用 比较函数 INTERVAL() 函数 实现数据按区间分组
  7. Java并发编程(十三)同步容器类
  8. Sublime 中 SFTP插件的使用
  9. MVVMLight-Mensenger 学习笔记
  10. jdk的安装 打包jar 运行jar