题意
判断是不是存在三角恋,三角恋就是a 喜欢 b,b 喜欢 c,c 喜欢 a。给定一个01的邻接矩阵,然后来判断是不是存在狗血恋情。
思路
"三角恋"放在图里就相当于判断是不是一个有向无环图,直接上队列上拓扑排序算法,模板题。
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 2005;
struct edge{
int to;
int next;
}e[4000005];
char map[maxn];
int head[maxn];
int s[maxn];
int cnt,n;
queue<int>q;
void clear_set()
{
cnt = 0;
memset(head,-1,sizeof(head));
memset(s,0,sizeof(s));
while(!q.empty()) q.pop();
}
void addedge(int x,int y)
{
e[cnt].to = y;
e[cnt].next = head[x];
head[x] = cnt++;
}
int topsort()
{
for(int i = 1;i <= n;i++){
if(s[i] == 0){
q.push(i);
}
}
int k = 0; //统计拓扑排序的人数
while(!q.empty()){
int p = q.front();
k++;
q.pop();
for(int i = head[p];~i;i = e[i].next){
edge t = e[i];
if(--s[t.to] == 0){
q.push(t.to);
s[t.to] = -1;
}
}
}
return k;
}
int main()
{
int t;
scanf("%d",&t);
for(int k = 1;k <= t;k++){
clear_set();
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%s",map+1);
for(int j = 1;j <= n;j++){
if(map[j] == '1'){
addedge(i,j); //i喜欢j
s[j]++;
}
}
}
int ans = topsort();
if(ans == n){
printf("Case #%d: No\n",k);
}
else{
printf("Case #%d: Yes\n",k);
}
}
return 0;
}
愿你走出半生,归来仍是少年~