博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1407 稳定婚姻
阅读量:4684 次
发布时间:2019-06-09

本文共 1472 字,大约阅读时间需要 4 分钟。

题面:

本题建图时:夫妻之间:女孩指向男孩情人之间:男孩指向女孩然后Tarjan求强连通分量,对于一对夫妻,如果两人在同一个强连通分量里,那么这对婚姻就是不安全的,反之,则是安全的。 Code:# include 
# include
# include
using namespace std;const int N=8010;const int M=20010;int m,n;string c1,c2;map
a;struct Edge{ int to,Next;}edge[(M<<1)+N];int head[N],cnt=1,is[(M<<1)+N];int T=0,low[N],dfn[N],s[N],tot=0,ha[N],in[N],n0=0;void add(int u,int v){ edge[++cnt].Next=head[u]; edge[cnt].to=v; head[u]=cnt;}void tarjan(int now){ dfn[now]=low[now]=++T; in[now]=1; s[++tot]=now; for(int i=head[now];i;i=edge[i].Next) { int v=edge[i].to; if(!dfn[v]) { tarjan(v); low[now]=min(low[now],low[v]); } else if(in[v]) low[now]=min(low[now],dfn[v]); } if(dfn[now]==low[now]) { n0++;int k; do { k=s[tot]; tot--; ha[k]=n0; in[k]=0; }while(k!=now); }}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>c1>>c2; a[c1]=i; a[c2]=n+i; add(i,n+i); } scanf("%d",&m); for(int i=1;i<=m;i++) { cin>>c1>>c2; add(a[c2],a[c1]); } for(int i=1;i<=n<<1;i++) if(!dfn[i]) tarjan(i); for(int i=1;i<=n;i++) if(ha[i]==ha[i+n]) printf("Unsafe\n"); else printf("Safe\n"); return 0;}

转载于:https://www.cnblogs.com/ukcxrtjr/p/11195444.html

你可能感兴趣的文章
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>
润乾报表 动态控制文本的显示
查看>>
[oracle] 如何使用myBatis在数据库中插入数据并返回主键
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
poj 1979 Red and Black(dfs)
查看>>
【.Net基础03】HttpWebRequest模拟浏览器登陆
查看>>
UML-画类图与交互图的顺序
查看>>
6月7 考试系统
查看>>
mysql 基本操作
查看>>
zTree async 动态参数处理
查看>>
Oracle学习之常见错误整理
查看>>
HTC Sensation G14开盒
查看>>
lock_sga引起的ksvcreate :process(m000) creation failed
查看>>
数据库插入数据乱码问题
查看>>
OVER(PARTITION BY)函数用法
查看>>
altium annotate 选项设置 complete existing packages
查看>>
【模式识别与机器学习】——SVM举例
查看>>