题目链接:http://codeforces.com/gym/101873/problem/D

题意:

给出 $n$ 个事实,表述为 "XXX are worse than YYY"。再给出 $m$ 个某人说的话,也是表述为 "XXX are worse than YYY",对于每句话都要判断是否正确:

如果正确,输出 "Fact";如果错误,输出 "Alternative Fact";如果无法判断,输出 "Pants on Fire"。

题解:

本题是求传递闭包。

关于传递闭包,例如有 $A=\{0,1,2\}$,基于 $A$ 的关系集合 $R=\{<0,0>,<1,0>,<2,2>,<1,2>,<2,1>\}$,

而 $R$ 的传递闭包 $t(R) = \{<0,0>,<1,0>,<2,2>,<2,1>,<1,2>,<1,1>,<2,0>\}$。

学过离散数学都知道,可以用warshall算法求传递闭包:

  首先用邻接矩阵 $A$ 表示关系。

  (1)置新矩阵 $A=M$;
  (2)令 $j=1$; 
  (3)对所有 $i$ 如果 $A[i,j] = 1$,则对 $k = 1,2,\cdots,n$,$A[i,k] = A[i,k] or A[j,k]$;
  (4)$j+=1$(i是行,j是列);
  (5)如果 $j \le n$,则转到步骤(3),否则算法结束。

for(int j=;j<=tot;j++) {
for(int i=;i<=tot;i++) {
if(!edge[i][j]) continue;
for(int k=;k<=tot;k++) {
edge[i][k]|=edge[j][k];
}
}
}

观察一下上述代码,可改成:

for(int j=;j<=tot;j++) {
for(int i=;i<=tot;i++) {
for(int k=;k<=tot;k++) {
edge[i][k]|=edge[i][j]&edge[j][k];
}
}
}

然后你就会发现,warshall算法和floyd算法异曲同工,然后你就会发现floyd算法全名是floyd-warshall算法。(QWQ)

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=+;
int n,m;
int edge[maxn][maxn];
int tot;
map<string,int> mp;
int main()
{
cin>>n>>m;
tot=;
mp.clear();
memset(edge,,sizeof(edge));
for(int i=,u,v;i<=n;i++)
{
string s;
cin>>s;
if(mp.count(s)) u=mp[s];
else u=mp[s]=++tot;
cin>>s; cin>>s; cin>>s;
cin>>s;
if(mp.count(s)) v=mp[s];
else v=mp[s]=++tot;
edge[u][v]=;
}
for(int j=;j<=tot;j++) {
for(int i=;i<=tot;i++) {
for(int k=;k<=tot;k++) {
edge[i][k]|=edge[i][j]&edge[j][k];
}
}
}
for(int i=,u,v;i<=m;i++)
{
string s;
cin>>s;
u=mp[s];
cin>>s; cin>>s; cin>>s;
cin>>s;
v=mp[s];
if(edge[u][v]) printf("Fact\n");
else if(edge[v][u]) printf("Alternative Fact\n");
else printf("Pants on Fire\n");
}
}

Gym 101873D - Pants On Fire - [warshall算法求传递闭包]的更多相关文章

  1. Warshall算法求传递闭包及具体实现

    传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y ...

  2. POJ 2253 Frogger(warshall算法)

    题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...

  3. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  4. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  5. HDU-1233 还是畅通工程 (prim 算法求最小生成树)

    prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  6. Dijkstra算法求单源最短路径

    Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...

  7. ZOJ Problem - 2588 Burning Bridges tarjan算法求割边

    题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...

  8. HDU 1269 迷宫城堡 tarjan算法求强连通分量

    基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...

  9. Kruskal和Prim算法求最小生成树

    Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...

随机推荐

  1. PHP异步扩展Swoole笔记(1)

    安装Swoole扩展 通过pecl安装, 系统中最好已经有http2依赖, 如果是Ubuntu, 可以直接通过apt安装nghttp2, 如果是Centos或者需要自己编译, 在Github下载ngh ...

  2. JAVA与C#的区别

    Java和C#都是编程的语言,它们是两个不同方向的两种语言 相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) 区别: 1.c#中的命名空间是namespace ...

  3. ubuntu intel网卡驱动安装(华硕B250F GAMING主板 )

    jikexianfeng@jikexianfeng:~$ sudo sudo lspci -knn :]: Intel Corporation Device [:591f] (rev ) Subsys ...

  4. 解决CEF中显示Flash动画弹出安全警告问题

    一. 1.Xilium.CefGlue. CefApp (CefApp.cs文件)类on_before_command_line_processing方法内设置flash路径.版本号等. m_comm ...

  5. 利用百度API(js),怎样通过地址获取经纬度

    根据经纬度找到具体地址:http://api.map.baidu.com/geocoder?location=纬度,经度&output=输出格式类型&key=用户密钥如:http:// ...

  6. 【iCore1S 双核心板_FPGA】例程十七:基于双口RAM的ARM+FPGA数据存取实验

    实验现象: 核心代码: module DUAL_PORT_RAM( input CLK_12M, inout WR, input RD, input CS0, :]A, :]DB, output FP ...

  7. 挖坑:hive集成kerberos

    集成hive+kerberos前,hadoop已经支持kerberos,所以基础安装略去: https://www.cnblogs.com/garfieldcgf/p/10077331.html 直接 ...

  8. js 模仿jquery 写个简单的小demo

    <div id="div" style="background:red;width:100px;height:300px"> 123123123 & ...

  9. open-falcon监控Flume

    1.首先你需要知道flume的http监控端口是否启动 请参考博文 Flume的监控参数 即在 http://localhost:3000/metrics 可以访问到如下内容 2.在open-falc ...

  10. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...