hdoj4324三角恋 拓扑入门模板题

版权声明:那个,最起码帮我加点人气吧,署个名总行吧 https://blog.csdn.net/qq_41670466/article/details/83052577

题意就是给你一个方阵,在方阵种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;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/83052577