1034 Head of a Gang (30分)

这题看清楚题的话,题目说两个人关系的质量取决于两个人所有通话时间的总和。
对于黑帮老大,就是和其他人关系质量最大的那个人。

然后读懂题之后就可以把关系定义成边,人定义成点,关系质量就是边权。

问题就转化成,求一个图上有几个连通块,每个连通块中,所具有边权最大的点是哪个。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e6+10;

unordered_map<string,int> mp1;
unordered_map<int,string> mp2;
map<string,int> ans;
long long weight[2010];
int g[2010][2010],vis[2010],ID=0;

int sum=0,cnt=0,head=-1,maxVal;

void dfs(int rt) {
    if (weight[rt]>maxVal) {
        maxVal=weight[rt];
        head=rt;
    }
    vis[rt]=1;
    cnt++;
    for (int i=1;i<=ID;i++) {
        if (g[rt][i]) {
            sum+=g[rt][i];
            g[rt][i]=g[i][rt]=0;
            if (!vis[i]) dfs(i);
        }
    }
}

int main() {
//     freopen("in.txt","r",stdin);

    int N,K;
    scanf("%d%d",&N,&K);
    for (int i=1;i<=N;i++) {
        char a[10],b[10];
        int t;
        scanf("%s%s%d",a,b,&t);
        if (mp1[a]==0) {
            mp1[a]=++ID;
            mp2[ID]=a;
        }
        if (mp1[b]==0) {
            mp1[b]=++ID;
            mp2[ID]=b;
        }
        int u=mp1[a],v=mp1[b];
        // printf("%d %d
",u,v);
        weight[u]+=t;
        weight[v]+=t;
        g[u][v]+=t;
        g[v][u]+=t;
    }
    for (int i=1;i<=ID;i++) {
        sum=0,cnt=0,head=0,maxVal=-1;
        if (!vis[i]) {
            dfs(i);
            if (cnt>2&&sum>K) {
                ans[mp2[head]]=cnt;
            }
        }
        // printf("%d %d %d %d
",sum,cnt,head,maxVal);
    }
    printf("%d
",ans.size());
    for (auto it:ans) {
        cout<<it.first<<" "<<it.second<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xyqxyq/p/13021823.html