PAT 1034. Head of a Gang (30)

//1034. Head of a Gang (30)
//#include "stdafx.h"

//case 3 and case 5一直无法通过:主要是没有对结果进行排序

//比较简单的dfs算法了


#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int Num(string x)
{
	int i;
	return (x[0]-'A')*26*26 + (x[1] -'A')*26+x[2]-'A';
}


vector<int> road[30*30*30];
int N, K;
bool visited[30*30*30] = {false};
int Wei[30*30*30] = {0};
vector<int> AAA; 
vector<int> result;

//bool flag = true;
void dfs(int curr)
{
	int i;
	//if (flag == false)
	//{
	//	return;
	//}
	for (i = 0;i<AAA.size();i++)
	{
		if ( curr != AAA[i] && visited[AAA[i]] == false && find(road[curr].begin(), road[curr].end(), AAA[i]) != road[curr].end()) 
		{
			if (find(result.begin(), result.end(), AAA[i]) == result.end())
			{	
				result.push_back(AAA[i]);
				visited[AAA[i]] = true;
			//flag = true;
				dfs(AAA[i]);
			}

		}
	}
}

void Print(int t)
{
	int tmp1 = t %26;
	t = t / 26;
	int tmp2 = t % 26;
	t = t/26;
	int tmp3 = t;
	printf("%c%c%c",tmp3+ 'A', tmp2+'A', tmp1 + 'A');
}


typedef struct Gang
{
	int id;
	int num;
}Gang;

vector<Gang> gang;

bool cmp(Gang g1, Gang g2)
{
	if (g1.id < g2.id)
	{
		return true;
	}
	return false;
}

int main()
{
			Gang tmpGang;
	scanf("%d %d", &N, &K);

	int i;
	//string a1, a2;
	char a1[4], a2[4];
	int w;

	for (i = 0;i<N;i++)
	{
		/*scanf("%s %s %d", &a1, &a2, &w);*/
		cin >> a1 >> a2 >> w;
		int t1 = Num(a1);
		int t2 = Num(a2);
		
		if (find(AAA.begin(), AAA.end(), t1) == AAA.end())
		{
			AAA.push_back(t1);
		}
		if (find(AAA.begin(), AAA.end(), t2) == AAA.end())
		{
			AAA.push_back(t2);
		}

		Wei[t1] += w;
		Wei[t2] += w;

		if (find(road[t1].begin(), road[t1].end(), t2) == road[t1].end())
		{
			road[t1].push_back(t2);
		}
		if (find(road[t2].begin(), road[t2].end(), t1) == road[t2].end())
			road[t2].push_back(t1);
	}

	//vector<int> Gang;
	//vector<int> Gangsize;

	//对Group进行合并操作
	int j;
	for (i = 0;i<AAA.size();i++)
	{	
		if (visited[AAA[i]] == true)
		{
			continue;
		}
		result.clear();
		result.push_back(AAA[i]);
		//flag = true;
		dfs(AAA[i]);

		if(result.size() <= 2)
			continue;

		int total = 0;
		//找到当前result里面weight最大的那个。
		for (j = 0;j<result.size();j++)
		{
			total += Wei[result[j]];
		}
		total /= 2;
		if (total <= K)
		{
			continue;
		}
				
		int maxIndex = -1;
		int maxValue = 0;

		for (j = 0;j<result.size();j++)
		{
			if (maxIndex == -1 || Wei[result[j]] > maxValue)
			{
				maxValue = Wei[result[j]];
				maxIndex = result[j];
			}
		}

		tmpGang.id = maxIndex;
		tmpGang.num = result.size();
		gang.push_back(tmpGang);
		//Gang.push_back(maxIndex);
		//Gangsize.push_back(result.size());
		//cout <<maxIndex<< " " << result.size() << endl; 
	}

	cout << gang.size() << endl;

	sort(gang.begin(), gang.end(), cmp);
	for (i = 0;i<gang.size();i++)
	{
		Print(gang[i].id);
		cout <<" " << gang[i].num << endl;;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值