pat 1034. Head of a Gang (30)

来源:互联网 发布:双十一淘宝联盟 编辑:程序博客网 时间:2024/05/06 14:25

DFS寻找连通分量

#include<stdio.h>#include<iostream>#include<string>#include<vector>#include<map>#include<algorithm>#define SIZE 2000#define INF 0x7fffffffusing namespace std;int graph[SIZE][SIZE], call[SIZE];bool flag[SIZE];map<string, int> hh;map<int, string> rhh;struct gang{    vector<int>mem;    string head;    int min,fl;}gg[SIZE];void Search(int num, int n,int s){    for (int i = 0; i < n;i++)        if (!flag[i] && graph[s][i]){            flag[i] = true;            Search(num, n, i);            gg[num].mem.push_back(i);            gg[num].min += call[i];        }}int DFS(int n){    int num = 0;    for (int i = 0; i < n;i++)        if (!flag[i]){            flag[i] = true;            Search(num, n,i);            gg[num].mem.push_back(i);            gg[num].min += call[i];            num++;        }    return num;}bool cmp(const struct gang &a, const struct gang &b){    if (a.fl == b.fl)        return a.head < b.head;    else return a.fl < b.fl;}int main(){    freopen("1.in", "r", stdin);    int n, limit;    scanf("%d%d", &n, &limit);    int i,min,ele;    char from[4], to[4];    for (i = 0,ele = 0; i < n; i++){        scanf("%s%s%d", from, to,&min);        if (hh.find(from) == hh.end())            hh[from] = ele++;        if (hh.find(to) == hh.end())            hh[to] = ele++;        int s = hh[from], d = hh[to];        graph[s][d] = graph[d][s] = min;        call[s] += min;        call[d] += min;        if (rhh.find(s) == rhh.end())            rhh[s] = from;        if (rhh.find(d)==rhh.end())            rhh[d] = to;    }    int numofgang = DFS(ele);    int gang = 0;    map<string, int>::iterator k;    for (i = 0; i < numofgang; i++){        if (gg[i].mem.size() < 3||gg[i].min/2<=limit){            gg[i].fl = INF;            continue;        }        int max = 0,index = -1;        for (int j = 0; j < gg[i].mem.size();j++)            if (call[gg[i].mem[j]] > max){                max = call[gg[i].mem[j]];                index = gg[i].mem[j];            }        gg[i].head = rhh[index];        gang++;    }    sort(gg, gg + numofgang, cmp);    printf("%d\n", gang);    for (i = 0; i < gang; i++)        cout << gg[i].head << ' ' << gg[i].mem.size() << endl;    return 0;}
0 0