PAT1034(用了炒鸡多的map…) (:_」∠)

#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <string.h>
#include <map>
#include <stack>
#define INF 0x3f3f3f3fusing namespace std;
const int MAXN = 2000;
int S[MAXN];
int T[MAXN];
map<string, int> nToi; //name to index
map<int, string> iTon; //index to name
map<string, int> tsum; //<root,timesum>
map<string, int> maxt;//<root,maxtime>
map<string, string> head;//<root,head>
map<string, int> ans; //<head,number of nodes>int N, K;int FindRoot(int n)
{if (S[n] < 0) return n;else return S[n] = FindRoot(S[n]);
}
void Union(int n1, int n2, int t)
{T[n1] += t;T[n2] += t;int R1 = FindRoot(n1); int R2 = FindRoot(n2); if (R1 != R2) {if (S[R1] < S[R2]) {//R2加到R1S[R1] += S[R2];S[R2] = R1;if (maxt[iTon[R1]] < maxt[iTon[R2]]){maxt[iTon[R1]] = maxt[iTon[R2]];head[iTon[R1]] = head[iTon[R2]];}if (T[n1] > maxt[iTon[R1]]) {maxt[iTon[R1]] = T[n1];head[iTon[R1]] = iTon[n1];}if (T[n2] > maxt[iTon[R1]]) {maxt[iTon[R1]] = T[n2];head[iTon[R1]] = iTon[n2];}tsum[iTon[R1]] += tsum[iTon[R2]] + t;tsum.erase(iTon[R2]);}else {S[R2] += S[R1];S[R1] = R2;if (maxt[iTon[R2]] < maxt[iTon[R1]]){maxt[iTon[R2]] = maxt[iTon[R1]];head[iTon[R2]] = head[iTon[R1]];}if (T[n1] > maxt[iTon[R2]]) {maxt[iTon[R2]] = T[n1];head[iTon[R2]] = iTon[n1];}if (T[n2] > maxt[iTon[R2]]) {maxt[iTon[R2]] = T[n2];head[iTon[R2]] = iTon[n2];}tsum[iTon[R2]] += tsum[iTon[R1]] + t;tsum.erase(iTon[R1]);}}else {tsum[iTon[R1]] += t;if (T[n1] > maxt[iTon[R1]]) {maxt[iTon[R1]] = T[n1];head[iTon[R1]] = iTon[n1];}if (T[n2] > maxt[iTon[R1]]) {maxt[iTon[R1]] = T[n2];head[iTon[R1]] = iTon[n2];}}}
int main()
{#ifdef  LIUFILE *ss;freopen_s(&ss, "1.txt", "r", stdin);
#endif memset(T, 0, sizeof(T));string n1, n2;int t,ind;cin >> N >> K;for (int i = 0; i < N; i++){cin >> n1 >> n2 >> t;if (!nToi.count(n1)){ind = nToi.size();nToi[n1] = ind;iTon[ind] = n1;S[ind] = -1;tsum[n1] = 0;maxt[n1] = t;head[n1] = n1;}if (!nToi.count(n2)){ind = nToi.size();nToi[n2] = ind;iTon[ind] = n2;S[ind] = -1;tsum[n2] = 0;maxt[n2] = t;head[n2] = n2;}Union(nToi[n1], nToi[n2], t);}int cnt = 0;for (auto &ts : tsum){if (ts.second > K){if (S[nToi[ts.first]] <- 2){++cnt;ans[head[ts.first]] = abs(S[nToi[ts.first]]);}}}cout << cnt << endl;for (auto &a : ans){cout << a.first << ' ' << a.second << endl;}return 0;
}

PAT1114

#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <string.h>
#include <map>
#include <set>
#define INF 0x3f3f3f3fusing namespace std;
const int MAXN = 1100;
int N;
map<int,int> S;
typedef struct info
{int esum;int asum;int smallestID;
};struct ans {int ID;int M;double avsets;double avarea;
}A[MAXN];set<int> mem;map<int, info> fams;int findroot(int n)
{if (S[n] < 0) return n;else return S[n] = findroot(S[n]);
}void Union(int n1, int n2)
{if (!mem.count(n2)){mem.insert(n2);S[n2] = -1;fams[n2].asum = 0;fams[n2].esum = 0;fams[n2].smallestID = n2;}int R1 = findroot(n1);int R2 = findroot(n2);if (R1 != R2){if (R1 < R2)//R2添加到R1{S[R1] += S[R2];S[R2] = R1;fams[R1].asum += fams[R2].asum;fams[R1].esum += fams[R2].esum;fams[R1].smallestID = min(fams[R1].smallestID, fams[R2].smallestID);if (n1 < fams[R1].smallestID) fams[R1].smallestID = n1;if (n2 < fams[R1].smallestID) fams[R1].smallestID = n2;fams.erase(R2);}else{S[R2] += S[R1];S[R1] = R2;fams[R2].asum += fams[R1].asum;fams[R2].esum += fams[R1].esum;fams[R2].smallestID = min(fams[R1].smallestID, fams[R2].smallestID);if (n1 < fams[R2].smallestID) fams[R2].smallestID = n1;if (n2 < fams[R2].smallestID) fams[R2].smallestID = n2;fams.erase(R1);}}
}bool cmp(ans a, ans b)
{if (a.avarea != b.avarea) return a.avarea > b.avarea;else return a.ID < b.ID;
}void updateinfo(int n, int es, int a)
{int R = findroot(n);fams[R].asum += a;fams[R].esum += es;}void print()
{int cnt = fams.size();cout << cnt << endl;int i = 0;for (auto &f : fams){A[i].ID = f.second.smallestID;A[i].M = 0 - S[findroot(f.second.smallestID)];A[i].avsets = double(f.second.esum) / A[i].M;A[i].avarea = double(f.second.asum) / A[i].M;++i;}sort(A, A + cnt, cmp);for (i = 0; i < cnt; i++){printf("%04d %d %.3f %.3f\n", A[i].ID, A[i].M, A[i].avsets, A[i].avarea);}
}int main()
{#ifdef  LIUFILE *ss;freopen_s(&ss, "1.txt", "r", stdin);
#endif int id, p1, p2, k, ch, es, a;cin >> N;for (int i = 0; i < N; i++){cin >> id >> p1 >> p2 >> k;if (!mem.count(id)) { mem.insert(id);S[id] = -1; fams[id].asum = 0;fams[id].esum = 0;fams[id].smallestID = id;}if(p1!=-1)Union(id, p1);if(p2!=-1)Union(id, p2);for (int j = 0; j < k; j++){cin >> ch;Union(id, ch);}cin >> es >> a;updateinfo(id, es, a);}print();return 0;
}

PAT 10341114(并查集)相关推荐

  1. PAT甲级1118 Birds in Forest :[C++题解]并查集

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:并查集的合并和查询. 问:一张照片上的鸟如何合并?相邻的合并(笔者采用的方式)或者全合并到第一只鸟就行,遍历一遍.所有照片中的鸟,合并 ...

  2. PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 先建边.读入每家的信息,在本人和父母(如果有的话),本人与子女(如果有的话)之间分别建边.边用结构体来存,边记录两个端点. 遍历每条 ...

  3. PAT甲级1013 Battle Over Cities:[C++题解]并查集、结构体存边

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:并查集题目. 不清楚并查集的小伙伴,请移步并查集原理并查集板子:acwing836. 合并集合. 题意:给定一个连通图,当删掉任意1个 ...

  4. PAT甲级1126 Eulerian Path:[C++题解] 欧拉路径、并查集,测试点4有问题请进来

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 欧拉图: 1)连通 2)度都为偶数 半欧拉图:欧拉路径:2)连通2) 度为奇数的结点有两个,其他度都是偶数 非欧拉图:不是欧拉图和半 ...

  5. PAT甲级1021 Deepest Root :[C++题解]树的最大深度、并查集、dfs求树的深度

    文章目录 题目分析 题目链接 题目分析 分析: 考察知识点:并查集.dfs.树的深度 给定n个结点,n-1条边,只要能保证只有1个连通分量,就是一棵树.否则的话就不是树,它是不连通的. 用并查集来看是 ...

  6. PAT - L1-020. 帅到没朋友(裸并查集)

    L1-020. 帅到没朋友 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为 ...

  7. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  8. PAT甲级题目翻译+答案 AcWing(并查集)

    1013 Battle Over Cities (25 分) 题意 :给图,问去掉所询问的一个点后,需要添加多少条边可以使图连通,N<1000N<1000N<1000 思路 :并查集 ...

  9. PAT 1114 Family Property 并查集

    This time, you are supposed to help us collect the data for family-owned property. Given each person ...

  10. 【PAT - 甲级1034】Head of a Gang (30分)(并查集)

    题干: One way that the police finds the head of a gang is to check people's phone calls. If there is a ...

最新文章

  1. CCF系列之画图(201409-2)
  2. 毕业5年决定你的一生_2
  3. 平均获客成本_获客成本创新高,英语流利说(LAIX.US)获客难流利
  4. iOS故障排除指南:基本技巧
  5. for、while循环及其变体
  6. 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法
  7. Openresty (nginx + lua)
  8. 阿里云移动研发平台EMAS,是如何连续5年安全护航双11的?
  9. 数组深拷贝_JavaScript之深浅拷贝
  10. Innobackupx工具命令简单解析
  11. MMIO与PIO区别
  12. 工欲善其事必先利其器——网络工程师必备六款软件(收藏下载❤️)
  13. fread函数 linux在哪,fread函数返回值
  14. 存档修改 html,制作可以修改.rpgsave存档的网页
  15. 关于 Nginx 0day 漏洞,需要采取哪些措施?
  16. flashFXP V4.0 烈火汉化绿色版
  17. JQuery(1)——JQuery如何读
  18. 2.12用lambda表达式对列表进行排序
  19. 导出 服务器 excel文件,服务器数据库导出excel文件格式
  20. 第一篇:瑞吉外卖项目概述

热门文章

  1. web报表工具FineReport常见的数据集报错错误代码和解释 1
  2. TinyPNG客户端
  3. LBR_iiwa_14_R820代码解析
  4. 架构设计参考项目系列主题:最全的权限系统设计方案
  5. MBA-day10数学-浓度问题
  6. 广州周立功CanTest卡使用教程一
  7. 优化函数SGD/AdaGrad/AdaDelta/Adam/Nadam
  8. 计算机网络自顶向下方法 习题参考答案 第四章
  9. C语言(算术、左移、赋值、位、sizeof计算大小、取反~、强制转换、条件)操作符..
  10. 渗透测试--越权测试BroupSuite安装教程