您的位置:首页 > 其它

PAT (Advanced Level) 1034. Head of a Gang (30)

2016-05-21 22:11 555 查看
简单DFS。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include<algorithm>
#include<iostream>
using namespace std;

const int maxn=2000+10;
map<string,int>m1;
map<int,string>m2;
int n,k,tot;

struct Edge
{
int u,v,val;
}e[maxn];

struct Ans
{
string name;
int cnt;
}ans[maxn];
int num;

vector<int>g[maxn];
int flag[maxn];
int Block;
int cnt[maxn];

void dfs(int x)
{
num++; flag[x]=Block;
for(int i=0;i<g[x].size();i++)
{
if(flag[g[x][i]]!=0) continue;
dfs(g[x][i]);
}
}

bool cmp(const Ans&a,const Ans&b){return a.name<b.name;}

int main()
{
scanf("%d%d",&n,&k); tot=0;
memset(flag,0,sizeof flag);
memset(cnt,0,sizeof cnt);
for(int i=1;i<=n;i++)
{
string a,b; cin>>a>>b>>e[i].val;
if(m1[a]==0)
{
m1[a]=++tot;
m2[tot]=a;
}
if(m1[b]==0)
{
m1[b]=++tot;
m2[tot]=b;
}
e[i].u=m1[a];
e[i].v=m1[b];
cnt[e[i].v]+=e[i].val;
cnt[e[i].u]+=e[i].val;
g[e[i].u].push_back(e[i].v);
g[e[i].v].push_back(e[i].u);
}

num=0;
int t=0;
for(int i=1;i<=tot;i++)
{
if(flag[i]!=0) continue;
Block++; num=0; dfs(i);
if(num<=2) continue;
int sum=0;
for(int j=1;j<=n;j++)
if(flag[e[j].u]==Block&&flag[e[j].v]==Block)
sum=sum+e[j].val;
if(sum<=k) continue;

int id,Max=-1;
for(int j=1;j<=tot;j++)
if(flag[j]==Block&&cnt[j]>Max)
Max=cnt[j],id=j;

ans[t].name=m2[id];
ans[t].cnt=num;
t++;
}

sort(ans,ans+t,cmp);

printf("%d\n",t);
for(int i=0;i<t;i++)
cout<<ans[i].name<<" "<<ans[i].cnt<<endl;

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