您的位置:首页 > 其它

pat 1034. Head of a Gang (30)

2015-03-08 21:43 246 查看
DFS寻找连通分量

#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
#define SIZE 2000
#define INF 0x7fffffff
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pat dfs