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 - 甲级 - 1034. Head of a Gang (30)(DFS求连通块)
- PAT (Advanced) 1034. Head of a Gang (30)
- 【PAT甲级】1034. Head of a Gang (30)
- 1034. Head of a Gang (30)-PAT甲级真题
- pat-a1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30)
- 1034. Head of a Gang (30) PAT甲级刷题
- PAT (Advanced Level) 1034. Head of a Gang (30)
- pat 1034. Head of a Gang (30)
- PAT-A-1034. Head of a Gang (30)
- PAT (Advanced Level)1034. Head of a Gang (30) map的灵活运用
- PAT甲级1034. Head of a Gang (30)
- PAT_A 1034. Head of a Gang (30)
- pat 甲级 1034. Head of a Gang (30)
- PAT 1034. Head of a Gang(30)
- 【PAT】1034. Head of a Gang (30)
- PAT 甲级 1034. Head of a Gang (30)
- PAT (Advanced) 1034. Head of a Gang (30)
- PAT甲题题解-1034. Head of a Gang (30)-并查集
- PAT 1034. Head of a Gang (30)