题意:给出一堆人的喜爱关系,判断有没有三角恋-_-||

其实就是判断是否存在三条边的环。

一开始我是这么想的:

先拓扑排序,如果没有环那就直接No
如果有环?挑出环里的任意一个点(拓扑排序结束后不在拓扑序里面的点就在环里),然后从这个点开始dfs,看三步之后能不能回到这个点。(可以证明,只要考察一个点就行)

然而TLE了= =

其实仔细想想可以发现,后面那个dfs没有必要。

注意一个细节:A[i][j]<>A[j][i]。也就是说若i到j不通,那么j到i一定通

可以证明,若这样的图中存在环,那么一定存在三角环(证明Reference:http://blog.csdn.net/xiaofengcanyuexj/article/details/29179639)

数据不大,邻接矩阵就ok

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define MAXN 2100 int a[MAXN][MAXN];
int d[MAXN];
bool ok;
int N,T,x,y; void topsort()
{
bool circle=false;
int i=;
while(i<N)
{
int j=;
while(d[j]!=) j++;
if(j==N+)
{
circle=true;
break;
}
d[j]=-;
for(int k=;k<=N;k++)
if(a[j][k]==)
{
d[k]--;
a[j][k]=;
}
i++;
}
if((circle)&&(N>=))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
} int main()
{
cin>>T;
for(int Times=;Times<=T;Times++)
{
cin>>N;
memset(d,,sizeof(d));
memset(a,,sizeof(a));
char ch[];
for(int i=; i<=N; i++)
{
scanf("%s",ch);
for(int j=;j<=N;j++)
{
if (ch[j-]=='')
{
d[j]++;
a[i][j]=;
}
}
}
cout<<"Case #"<<Times<<": ";
topsort(); }
return ;
}

顺便记两个拓扑排序模板:

邻接矩阵:见本题

邻接表:

 邻接表建图:
void addedge(int x,int y) //x->y
{
d[y]++; //d[i]:点i的入度
ev[cnt]=y; //ev[i]:第i条边的destination
nxt[cnt]=head[x]; //nxt[i]:第i条边的下一条边
head[x]=cnt; //head[i]:由i节点出发的第一条边的序号
cnt++;
} -------------------------------------------------------------------------------- void topsort()
{
vector<int> vec;
for(int i=; i<=N; i++)
if(d[i]==) vec.push_back(i);
for(int i=; i<vec.size(); i++)
{
int x=vec[i];
for(int j=head[x]; j!=; j=nxt[j])
{
int y=ev[j];
d[y]--;
if(d[y]==) vec.push_back(y);
}
}
int last=vec.size();
//last!=N说明有环
}
如果嫌慢可以把vector改写成普通数组

//PS:Reference的那个博主是地大的本科生,本科毕业就拿到了人人+去哪儿offer,orz

hdu 4324 拓扑排序的更多相关文章

  1. HDU 4324 (拓扑排序) Triangle LOVE

    因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. #include <c ...

  2. HDU 4857 拓扑排序 优先队列

    n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...

  3. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  4. HDU 5638 拓扑排序+优先队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...

  5. hdu 2647 (拓扑排序 邻接表建图的模板) Reward

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...

  6. 传递 hdu 5961 拓扑排序有无环~

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961 题目为中文,这里就不描述题意了. 思路: 从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分 ...

  7. HDU 5438 拓扑排序+DFS

    Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  8. hdu 3342 拓扑排序 水

    好久没切题  先上水题! 拓扑排序! 代码: #include<iostream> #include<cstdio> #include<cstring> using ...

  9. HDU 2094 拓扑排序

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

随机推荐

  1. 【MySql】存储过程添加事务

    存储过程使用SQLException捕获SQL错误,然后处理: 我们可以在MySQL存储过程中捕获SQL错误,然后通过事务判断,回滚(ROLLBACK)还是提交(COMMIT). CREATE PRO ...

  2. QT 网络编程一

    QT如果要进行网络编程首先需要在.pro中添加如下代码:QT += network 在头文件中包含相关头文件 #include <QHostInfo> #include <QNetw ...

  3. 建立mvc过程

    1.public class   dbContext:Dbcontext { private readonly static string CONNECTION_STRING="name=d ...

  4. python 二叉树

    class Node(object): def __init__(self, data=None, left=None, right=None): self.data = data self.left ...

  5. 乐易贵宾VIP教程:百度贴吧 - QQ部落 - QQ空间 Post实战系列视频课程

    教程挺不错,3套案例的实战,有需要的可以看一下百度贴吧课程目录:1.百度登录抓包分析2.百度登录[代码实现]3.百度验证码登录[代码实现]4.贴吧关注[抓包分析]5.贴吧关注(代码编写)6.贴吧签到[ ...

  6. 树莓派Odroid等卡片式电脑上搭建NAS教程系列5-Samba服务器安装

    本文章首发于浩瀚先森博客,地址: http://www.guohao1206.com/2016/08/23/967.html samba时一款为了实现linux系统中的文件能在windows系统中正常 ...

  7. lecture8-RNN的训练方法之二三

    HInton第8课,之所以说之二三,是因为训练RNN的四种方法之一:长短时记忆在lecture7中介绍过了,这里介绍的是第二和第三种方法:HF优化和Echo (这个字觉得翻译成回声是不是欠妥,所以保留 ...

  8. 快速备份和还原 MySQL 数据库的另一种方法

    一直使用 SQL Server 作为公司产品的数据库来存储系统数据,所以备份还原一直都不是问题,因为 SQL Server 的备份还原非常迅速和易用.但今年公司改变策略,使用起 MySQL 数据库作为 ...

  9. Windows 10 后台音频

    UWP版本的网易云音乐已经上架,虽然还不支持Windows Phone但是整体而言功能已经比较齐全了! 那么如何在Windows 10 UWP实现后台播放呢? 我之前是一直在做Windows Phon ...

  10. exgcd,求乘法逆元

    procedure exgcd(a,b:int64); var t:longint; begin then begin x:=;y:=; exit; end else exgcd(b,a mod b) ...