hdoj4324三角恋 拓扑入门模板题

本文介绍了一种在有向图中检测三角恋关系的高效算法,即检查是否存在a->b, b->c, c->a的闭环。通过拓扑排序的方法,如果节点数量不等于边的数量加一,则存在环,可能为三角恋关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意就是给你一个方阵,在方阵种A(i,j)=1表示i->有一条边,保证两个点只有一条有向边,先问你在给定的方阵中是否存在三角恋关系也就是 a->b,b->c,c->a如有就输出Yes。

要点:我之前思考时一直在想如何在最小的时间复杂度下判断最后形成的环是不是三个元素,然后发现好像都不是很行,查了别人的题解,发现我想多了只要判断最后是不是成环就好;

代码:

#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
#include<cstdlib>
#include<string>
#include<cstring>

using namespace std;

const int maxn = 2e3 + 10;
int in[maxn];
int n;
vector<int>vec[maxn];

void ini()
{
		memset(in, 0, sizeof(in));
		for (int i = 1; i <= n; i++)
				vec[i].clear();
}

void solve()
{
		int cnt = 0;
		queue<int> que;
		for (int i = 1; i <= n; i++)
				if (in[i] == 0)
				{
						cnt++;
						que.push(i);
				}
		while (!que.empty())
		{
				int t = que.front();
				que.pop();
				for (int i = 0; i < vec[t].size(); i++)
				{
						int p = vec[t][i];
						if (--in[p] == 0)
						{
								que.push(p);
								cnt++;
						}
				}
		}
		if (cnt == n)
				printf("No\n");
		else
				printf("Yes\n");
}

int main()
{
		int t;
		scanf("%d", &t);
		for (int i = 1; i <= t; i++)
		{
				char s[maxn];
				scanf("%d", &n);
				ini();
				for (int j = 1; j <= n; j++)
				{
						scanf("%s", s);
						for (int i = 0; i < n; i++)
						{
								if (s[i]== '1')
								{
										in[i + 1]++;
										vec[j].push_back(i + 1);
								}
						}
				}
				printf("Case #%d: ", i);
				solve();
		}
	//	system("pause");
		return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值