ural 1106. Two Teams

来源:互联网 发布:120网络歌曲 打包下载 编辑:程序博客网 时间:2024/06/11 02:35

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1106


题目描述:给定N个人中,每个人至少跟其它1个人是朋友,问你能否将这N个人分成两队,其中每一队里每个人都有朋友在对面队伍里面;

貌似会遇到那种跟题意违背的一个朋友都没有的人,这应该是个坑,所以需要判断一下;

思路就是边visit边分组,遍历每个点,若这个点之前没有visit过,放1组,将与它有关系的点标记visit后放第二组;



直接上AC代码:


#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <stdio.h>#include <string>#include <vector>#include <queue>#include <map>using namespace std;const int m_Size = 110;bool matrix[m_Size][m_Size];vector<bool>visited;vector<int> ans;void func(){int i, j, N;bool noAns = false;cin >> N;ans.clear();visited.resize(N + 1, false);for (i = 1; i <= N;i++)for (j = 1; j <= N; j++)matrix[i][j] = false;for (i = 1; i <= N; i++){while (cin >> j&&j)matrix[i][j] = true;}for (i = 1; i <= N; i++){if (!visited[i]){visited[i] = true;bool relation = false;for (j = 1; j <= N;j++)if (matrix[i][j]){visited[j] = true;relation = true;}if (relation)ans.push_back(i);else{ noAns = true; break; }}}if (noAns)cout << "0\n";else{cout << ans.size() << endl << ans[0];for (i = 1; i < ans.size(); i++)cout << ' ' << ans[i];cout << endl;}}int main(){freopen("out.txt", "w", stdout);freopen("in.txt", "r", stdin);func();}


0 0
原创粉丝点击