2022.2.11 练习 PAT甲 1034 Head of a Gang (原题链接)
图的深度遍历:
#include <bits/stdc++.h>
using namespace std;
const int MAX_NUM=2010;
int n,k;
int num=0;
int G[MAX_NUM][MAX_NUM]={0};
int weight[MAX_NUM]={0};
int visit[MAX_NUM]={0};
map<int,string> int_to_string;
map<string,int> string_to_int;
map<string,int> gang;
void DFS(int now,int& head,int& mem_num,int& value)
{
mem_num++;
visit[now]=1;
if(weight[now]>weight[head])
{
head=now;
}
for(int i=0;i<num;i++)
{
if(G[now][i]>0)
{
value+=G[now][i];
G[now][i]=G[i][now]=0;
if(visit[i]==0)
DFS(i,head,mem_num,value);
}
}
}
void DFSTrave()
{
for(int i=0;i<num;i++)
{
if(visit[i]==0)
{
int head=i,mem_num=0,value=0;
DFS(i,head,mem_num,value);
if(mem_num>2 && value>k)
gang[int_to_string[head]]=mem_num;
}
}
}
int change(string str)
{
//find函数:在容器中寻找值为k的元素,返回该元素的迭代器。否则,返回map.end()
if(string_to_int.find(str)!=string_to_int.end())
{
return string_to_int[str];
}
else
{
string_to_int[str]=num;
int_to_string[num]=str;
return num++;
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>k;
while(n--)
{
int w;
string str1,str2;
cin>>str1>>str2>>w;
int id1=change(str1);
int id2=change(str2);
weight[id1]+=w;
weight[id2]+=w;
G[id1][id2]+=w;
G[id2][id1]+=w;
}
DFSTrave();
cout<<gang.size()<<endl;
map<string,int>::iterator it;
for(it=gang.begin();it!=gang.end();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
并查集:
19分,测试点2,4,5过不了,我选择放弃,nm
#include <bits/stdc++.h>
using namespace std;
const int MAX_NUM=2010;
int n,k;
int num=0;
int weight[MAX_NUM]={0};
int father[MAX_NUM]={0};
int id1[2010];
int id2[2010];
int w[1010];
int flag[2010]={0};
map<int,string> int_to_string;
map<string,int> string_to_int;
map<string,int> gang;
map<string,int> value;
map<string,int> out;
int findfather(int x)
{
while(x!=father[x])
{
x=father[x];
}
return x;
}
void Union(int a,int b)
{
int head;
int child;
int fa=findfather(a);
int fb=findfather(b);
if(fa!=fb)
{
if(flag[fa]>0 && flag[fb]>0)
{
if(weight[fa]>=weight[fb])
{
head=fa;
child=fb;
}
else if(weight[fa]<weight[fb])
{
head=fb;
child=fa;
}
for(int i=0;i<num;i++)
{
if(father[i]==child)
father[i]=head;
}
}
if(weight[fa]>=weight[fb])
{
father[fb]=fa;
head=fa;
}
else if(weight[fa]<weight[fb])
{
father[fa]=fb;
head=fb;
}
}
flag[head]=1;
}
int change(string str)
{
if(string_to_int.find(str)!=string_to_int.end())
{
return string_to_int[str];
}
else
{
string_to_int[str]=num;
int_to_string[num]=str;
return num++;
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=0;i<2*n;i++)
{
father[i]=i;
}
for(int i=0;i<n;i++)
{
string str1,str2;
cin>>str1>>str2>>w[i];
id1[i]=change(str1);
id2[i]=change(str2);
weight[id1[i]]+=w[i];
weight[id2[i]]+=w[i];
}
for(int i=0;i<n;i++)
{
Union(id1[i],id2[i]);
}
for(int i=0;i<num;i++)
{
int head=father[i];
gang[int_to_string[head]]++;
value[int_to_string[head]]+=weight[i];
}
/*
for(int i=0;i<num;i++)
{
cout<<i<<" : "<<int_to_string[i]<<" "<<weight[i]<<endl;
cout<<"father of "<<i<<" is "<<father[i]<<" "<<int_to_string[father[i]]<<endl;
}
cout<<endl;
*/
int res=0;
map<string,int>::iterator it=gang.begin();
map<string,int>::iterator it1=value.begin();
for(;it!=gang.end(),it1!=value.end();it++,it1++)
{
/*
cout<<it->first<<" "<<it->second<<endl;
cout<<endl;
cout<<it1->first<<" "<<it1->second<<endl;
cout<<endl;
*/
if((it->second)>2 && (it1->second)>2*k)
{
res++;
out[it->first]=it->second;
}
}
cout<<res<<endl;
map<string,int>::iterator it2=out.begin();
for(;it2!=out.end();it2++)
{
cout<<it2->first<<" "<<it2->second<<endl;
}
return 0;
}