码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4324 Triangle LOVE

时间:2015-08-14 22:54:20      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

本题链接:点击打开链接

本题大意:

        题意分析(转载):此题可以一遍拓扑排序判环求解 即只需要找到一个环,就必定存在三元环 证明如下: 假设存在一个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;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4324 Triangle LOVE

标签:

原文地址:http://blog.csdn.net/lsgbb/article/details/47667115

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!