本题链接:点击打开链接
本题大意:
题意分析(转载):此题可以一遍拓扑排序判环求解 即只需要找到一个环,就必定存在三元环 证明如下: 假设存在一个n元环,因为a->b有边,b->a必定没边,反之也成立所以假设有环上三个相邻的点a-> b-> c,那么如果c->a间有边,就已经形成了一个三元环,如果c->a没边,那么a->c肯定有边,这样就形成了一个n-1元环。。。。所以只需证明n大于3时一定有三元环即可,显然成立。
具体请参见代码:
#include<stdio.h>
#include<string.h>
using namespace std;
char map[2010][2010];//存放两节点的关系1:i love j
int degree[2010];//存放节点入度
void toposort(int m)
{
int flag=0;
for(int i=1;i<=m;i++)//对每个点进行查找
{
int j=0;
while(degree[j])//找入度为0的点
j++;
if(j==m)//表明未找到,说明存在环
{
flag=1;
break;
}
else
{
degree[j]=-1;//若找到,将入度标为-1
for(int k=0;k<m;k++)//把此点引起的点的入度自减一次
{
if(map[j][k])
degree[k]--;
}
}
}
if(flag)//存在环,表明存在三角恋
printf("Yes\n");
else
printf("No\n");
}
int main()
{
int n,m,t=0;
scanf("%d",&n);
while(n--)
{
memset(map,0,sizeof(map));
memset(degree,0,sizeof(degree));
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%s", map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='1')//若i love j 把j入度自加一次
{
degree[j]++;
}
}
}
printf("Case #%d: ",++t);
toposort(m);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/lsgbb/article/details/47667115