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

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

一开始我是这么想的:

先拓扑排序,如果没有环那就直接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. git 本地分支与远程分支

    github上已经有master分支 和dev分支 在本地 git checkout -b dev 新建并切换到本地dev分支 git pull origin dev 本地分支与远程分支相关联 在本地 ...

  2. Stream 和 byte[]

    C# Stream 和 byte[] 之间的转换   一. 二进制转换成图片MemoryStream ms = new MemoryStream(bytes);ms.Position = 0;Imag ...

  3. 架设ftp反向代理服务器

    因网络环境限制,需要从内网(不能直接连通外网)向外部的ftp上传.下载文件,只能在网关服务器上架设ftp反向代理(网关服务器可同时连通外网与内网,但是不允许内部应用部署在这台机器上). 试了几个方案: ...

  4. sqlserver数据库附加分离备份还原命令

    --获取所有数据库的名称 select [name] from master.dbo.sysdatabases where [name]='master' --判断数据库是否存在 if exists( ...

  5. 使用Topshelf创建Windows服务

    概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...

  6. js中奇特的for循环写法

    //正常的for循环 for(var i=0;i<10;i++){ console.log(i); } //输出:1,2,3……10 //简写 for(var i=10;i--;){ conso ...

  7. SpringMVC学习--springmvc原理

    简介 springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合.springmvc是一个基于mvc的web框架. spring的结构图: mvc在b/ ...

  8. 如何用linux命令查看nginx是否在正常运行

      有时想知道nigix是否在正常运行,需要用linux命令查看nginx运行情况. 执行命令: ps -A | grep nginx  如果返回结果的话,说明有nginx在运行,服务已经启动. 如果 ...

  9. URL详解与URL编码

    作为前端,每日与 URL 打交道是必不可少的.但是也许每天只是单纯的用,对其只是一知半解,随着工作的展开,我发现在日常抓包调试,接口调用,浏览器兼容等许多方面,不深入去理解URL与URL编码则会踩到很 ...

  10. bzoj1066

    首先,我们可以想到从源点向每个有蜥蜴的地方连边,然后拆点,因为我们不能把一个点连向多条边,这样修改边的时候不可以,所以拆个点,就可以了 #include<iostream> #includ ...