1。<key,value>
2。if (mp.find(string)==mp.end() )则说明map里面没有string这个key
3。map中会自动按照key的递增排好序,可以当做一个大set用
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
using namespace std;
int g[2005][2005]={0};//g[i][j]=g[j][i]=总权值
int book[2005]={0};
map<string,int> mp;
map<int,string> mp2;
int num=0;//总顶点数
int change(string s)//string映射到int
{
if(mp.find(s)==mp.end())//没存过
{
num++;
mp[s]=num;
mp2[num]=s;
return num;
}
else//存过
{
return mp[s];
}
}
int vw[2005]={0};//每个点的权值
int ppnum=0;
int maxx=-1;
int maxxv;//头目
int sumw=0;
void dfs(int id)
{
book[id]=1;//访问
ppnum++;
if(vw[id]>maxx)//找老大
{
maxx=vw[id];
maxxv=id;
}
for(int i=1;i<=num;i++)
{
if(g[id][i]==0)
continue;
else
{
if(book[i]==1)
{
sumw+=g[id][i];//就算不能访问也要加边
g[id][i]=0;//加完立刻删除边,一面重复加边
g[i][id]=0;
}
else
{
sumw+=g[id][i];
g[id][i]=0;
g[i][id]=0;
dfs(i);
}
}
}
}
void init()
{
ppnum=0;
maxx=-1;
sumw=0;
}
int main()
{
// freopen("in.txt","r",stdin);
int N,K;
cin>>N>>K;
for(int i=0;i<N;i++)
{
string s1,s2;
int w;
cin>>s1>>s2>>w;
int id1=change(s1);
int id2=change(s2);
g[id1][id2]+=w;
g[id2][id1]+=w;
vw[id1]+=w;
vw[id2]+=w;
}
int cou=0;
map<string,int> ansmp;
for(int i=1;i<=num;i++)
{
if(book[i]==0)
{
init();
dfs(i);
if(ppnum>2&&sumw>K)
{
cou++;
ansmp[ mp2[maxxv] ]=ppnum;
}
}
}
cout<<cou<<endl;
for(map<string,int>::iterator it=ansmp.begin();it!=ansmp.end();it++)//利用map会自动按key排序的特性
cout<<it->first<<' '<<it->second<<endl;
return 0;
}