您的位置:首页 > 其它

ural 1106. Two Teams

2015-08-20 11:24 204 查看
题目链接: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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: