NKOJ2319 奇怪的班级 题解

  这是一道判断图中有没有奇环的问题,用dfs,二分图染色法即可。

  图的存储用邻接表表示,用邻接矩阵会MLE。

  需要注意的一点是图中点与点之间并不一定都是连通的,染色的时候不要漏点。

 1 #include<iostream>
 2 #include<map>
 3 #include<vector>
 4 #include<string>
 5 using namespace std;
 6
 7 bool setSex(map<int, int>& sex, vector<vector<int> >& isLoved, int code, int sexCode)
 8 {
 9     sex[code] = sexCode;
10     for (int i = 0; i < isLoved[code].size(); ++i)
11     {
12         if (sex[isLoved[code][i]] == sexCode)return true;
13         if (sex[isLoved[code][i]] ==0&& setSex(sex, isLoved, isLoved[code][i], -sexCode))return true;
14     }
15     return false;
16 }
17
18 int main()
19 {
20     int t;
21     cin >> t;
22     for (int i = 0; i < t; ++i)
23     {
24         map<string, int> nameToCode;
25         map<int, int> sex;//编号为i的人的性别。0代表未设定,1、-1分别代表男女
26         int N, M;
27         scanf("%d%d", &N, &M);
28         vector<pair<int, int> > temp;
29         int code=1;
30         for (int j = 0; j < M; ++j)
31         {
32             string name1,name2;
33             name1.resize(22);
34             name2.resize(22);
35             scanf(" %s", &name1[0]);
36             scanf(" %s", &name2[0]);
37             //cout << name1 << name2 << endl;
38             if (!nameToCode[name1])
39             {
40                 nameToCode[name1] = code++;
41             }
42             if (!nameToCode[name2])
43             {
44                 nameToCode[name2] = code++;
45             }
46             temp.push_back({ nameToCode[name1] ,nameToCode[name2] });
47         }
48         vector<vector<int> > isLoved;
49         for (int i = 0; i <= nameToCode.size(); ++i)
50         {
51             isLoved.push_back(vector<int>(0));
52         }
53         for (int i = 0; i < temp.size(); ++i)
54         {
55             isLoved[temp[i].first].push_back(temp[i].second);
56             isLoved[temp[i].second].push_back(temp[i].first);
57         }
58         bool hasHomo = 0;
59         for (int i = 1; i < nameToCode.size(); ++i)
60         {
61             if (sex[i]==0)
62             {
63                 if (setSex(sex, isLoved, i, 1) == true)
64                 {
65                     hasHomo = true;
66                     break;
67                 }
68             }
69         }
70         if (hasHomo) printf("YES\n");
71         else printf("NO\n");
72     }
73 }

时间: 2024-11-12 01:36:46

NKOJ2319 奇怪的班级 题解的相关文章

【基础练习】codevs2833 奇怪的梦境题解

题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息.屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下.可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断. 输入描述 Input Description 第一行,两个数N,M,表示有编号为1...N这N个按钮,屏幕上有M条信息. 接下来的M行,每行两个数ai,b

haoi2018奇怪的背包题解

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5302 对于一个物品,设它体积为v,那么,在背包参数为p的情况下,它能达到gcd(v,p)的倍数的重量 对于两个物品,设它们的体积为v1和v2,那么,在背包参数为p的情况下,他能达到gcd(v1,v2,p)的倍数的重量 对于每个物品,我们记下它的gcd(v,p),问题变为给定一个x,求有多少个v的集合,是集合内所有元素的gcd能被x整除 我们设dp[i][j]表示p的前i个约数有多少种

【bestcoder #36】ABCD题解

Strange Class Accepts: 519 Submissions: 1749 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 在Vivid的学校里,有一个奇怪的班级(SC).在SC里,这些学生的名字非常奇怪.他们的名字形式是这样的anbncn(a,b,c两两不相同.).例如,叫"abc","ddppqq"的学生是在SC里的,然而叫&

洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 &amp;&amp; spfa (存多条边示例)

题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 没经过一个城市,都会被收取一定的过路费(包括起点和终点).路上并没有收费站. 假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的.

BestCoder Round #36(Strange Class-模拟)

Strange Class Accepts: 519 Submissions: 1749 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 在Vivid的学校里,有一个奇怪的班级(SC).在SC里,这些学生的名字非常奇怪.他们的名字形式是这样的a n b n c n   (a,b,c两两不相同.).例如,叫"abc","ddppqq"的学生是在S

HDU-5198-Strange Class(Java+注意细节!)

Strange Class Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 634    Accepted Submission(s): 343 Problem Description In Vivid's school, there is a strange class(SC). In SC, the students' names

Strange Class

Strange Class Accepts: 519 Submissions: 1749 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description In Vivid's school, there is a strange class(SC). In SC, the students' names are very strange. They are i

2018.10.10 练习赛 状态压缩专练

T1 防守马克 题解: 贪心,用(力量+重量)排序然后\(dfs\); \(code\): #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct node{ int h,w,s; }a[30]; int n,h; bool c[30]; long long ans=-1; bool cmp(const node &x,const node &

奇怪的函数 (wikioi 3538/1696) 题解

[题目描述] 给定n,使得x^x达到或超过n位数字的最小正整数x是多少? [样例输入] 11 [样例输出] 10 [解题思路] 首先想到枚举,但是范围有点大,n<=2*10^9,果断用二分.其实这道题并不难,要用到一个求位数的公式trunc(t*(ln(t)/ln(10)))+1,初三自然是没学的,直接抄上公式,AC……,二分的时候注意一下退出的条件.(wikioi上1696和3538的题目不一样,但同一个程序都能AC,也不知道1696中的k是干嘛的……) [代码实现] 1 var n:qwor