oj-2找出可以感染者

#include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>

using namespace std;

int search(int **table, int a[100], int N, int M, int T){
	set<int>b;
	set<int>::iterator iter;
	set<int>tmp_b;
	int index = 0;
	int i = 0, j = 0, k = 0;

	//第一層感染人羣確認
	for (i = 0; i < M; i++)
	{
		for (j = 0; j < T; j++)
		{
			if (table[j][0] == a[i]){
				for (k = 0; k < M; k++){
					if (table[j][1] == a[k]) break;
				}
				if (k == M) b.insert(table[j][1]);
			}
			if (table[j][1] == a[i])
			{
				for (k = 0; k < M; k++)
				{
					if (table[j][0] == a[k]) break;
				}
				if (k == M) b.insert(table[j][0]);

			}
		}
	}
	for (iter = b.begin(); iter != b.end(); ++iter){
		tmp_b.insert(*iter);
	}
	
	//第二層感染人羣確認
	for (iter = tmp_b.begin(); iter != tmp_b.end(); ++iter)
	{
		for (j = 0; j < T; j++)
		{
			if (table[j][0] == *iter){
				for (k = 0; k < M; k++){
					if (table[j][1] == a[k]) break;
				}
				if (k == M) b.insert(table[j][1]);
			}
			if (table[j][1] == *iter)
			{
				for (k = 0; k < M; k++)
				{
					if (table[j][0] == a[k]) break;
				}
				if (k == M) b.insert(table[j][0]);

			}
		}
	}

	//輸出可疑感染人羣
	for (iter = b.begin(); iter != b.end(); ++iter)
	{
		cout << *iter << " ";
	}
	
	return 0;
}


int main()
{
	int N = 0, M = 0, T = 0;
	int **table = NULL;
	int a[100];
	
	memset(a, 0, sizeof(a));
	cin >> N >> M >> T;

	table = new int *[T];
	for (int j = 0; j < T; j++)
	{
		table[j] = new int[2];	
	}
	
	for (int i = 0; i < M; i++)
	{
		cin >> a[i];	
	}

	for (int i = 0; i < T; i++){
		for (int j = 0; j < 2; j++){
			cin >> table[i][j];
		}
	}
	
	for (int i = 0; i < T; i++){
		for (int j = 0; j < 2; j++){
			cout << table[i][j] <<" ";
		}
		cout << endl;
	}

	search(table, a, N, M, T);

	if (table)
	{
		for (int j = 0; j < 2; j++)
		{
			delete[] table[j];
		}
		delete[]table;
	}
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章