您的位置:首页 > 其它

1034. Head of a Gang (30)

2017-02-12 10:48 411 查看
可以set保存帮派人员,合并的时候就算有重复的他也不会重复保存

具体解释再代码中

这道题也可以构建个图,然后遍历,1个连通图就是一个帮派,进行筛选保存

#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
#pragma warning(disable:4996)
typedef struct flag{
int gang;//帮派再容器中的位置
int t;//通话时间
flag() { t = 0; }
}flag;
map<string, flag> s;//存各个人员信息
vector<set<string>> g;//帮派人员信息
typedef struct s_finally
{
string name;
int num;
bool operator<(const s_finally &that) const { return this->name < that.name; }
}s_finally;//结果的结构
int main()
{
int N, M;
cin >> N >> M;
for (int t = 0;t < N;t++)
{
char str1[4], str2[4];
int temp;
scanf("%s %s %d", str1, str2, &temp);
if (s.find(str1) == s.end() && s.find(str2) == s.end())//两个都未出现过
{
set<string> tempg;
tempg.insert(str1);
tempg.insert(str2);
g.push_back(tempg);
s[str1].t += temp;
s[str2].t += temp;
s[str1].gang = s[str2].gang = g.size() - 1;
}
else if (s.find(str1) == s.end() && s.find(str2) != s.end())//其中有一个出现过了
{
g[s[str2].gang].insert(str1);
s[str1].t += temp;
s[str2].t += temp;
s[str1].gang = s[str2].gang;
}
else if (s.find(str1) != s.end() && s.find(str2) == s.end())
{
g[s[str1].gang].insert(str2);
s[str1].t += temp;
s[str2].t += temp;
s[str2].gang = s[str1].gang;
}
else//都出现过了
{
s[str1].t += temp;
s[str2].t += temp;
if (s[str1].gang != s[str2].gang)//出现过的两个帮派不同,需要合并
{
g[s[str1].gang].insert(g[s[str2].gang].begin(), g[s[str2].gang].end());
int tt = s[str2].gang;
for (auto &x : g[s[str2].gang])
s[x].gang = s[str1].gang;
g[tt].clear();
}
}
}
vector<s_finally> resault;//保存要输出的结果
for (auto x : g)
{
int max=0;string name;int temp=0;
for (auto y : x)
{
temp += s[y].t;
if (s[y].t > max) { max = s[y].t;name = y; }
}
if (temp >2* M && x.size()>2)
{
s_finally fi;
fi.name = name;
fi.num = x.size();
resault.push_back(fi);
}
}
sort(resault.begin(), resault.end());
cout << resault.size() << endl;
for (auto x : resault)
printf("%s %d\n", x.name.c_str(), x.num);

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