刷题总结——road(ssoi)
题目:
题目背景
SOURCE:NOIP2016-RZZ-1
题目描述
有 N 个城市,这些城市通过 M 条无向边互相连通,每条边有一个权值 Ci ,表示这条边的长度为 2^(Ci) ,没有两条边的长度是相同的。
设 d(i,j)为城市 i 到城市 j 的最短路长度,求:
答案以二进制输出。
输入格式
第一行,两个正整数 N ,M 。
接下来 M 行,每行三个正整数 Ai,Bi,Ci ,表示城市 Ai,Bi 间有一条权值为 Ci 的无向边。
输出格式
输出一个二进制数,表示所有无序点对间的最短路长度之和(即问题描述中的式子)。
样例数据 1
输入 [复制]
5 6
1 3 5
4 5 0
2 1 3
3 2 1
4 3 4
4 2 2
输出
1000100
备注
【样例解释】
【数据规模与约定】
对于 30% 的数据,N,M≤50。
对于 60% 的数据,N,M≤100。
对于 80% 的数据,N≤2000;M≤10000。
对于 100% 的数据,1≤N≤105;1≤M≤2×105;1≤Ai,Bi≤N,Ai≠Bi,0≤Ci<M。
题解:
首先可以看出要选的边的集合为最小生成树(边互不相等且为2的x次方可以推出),然后dfs计算每条边左右两边对应的size然后计算这条边对答案的贡献
md忘记枚举边计算贡献这种操作了···
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> #include<cctype> #include<cstring> #include<string> #include<algorithm> using namespace std; int cnt=0,father[200005]; long long ans[500000]; int n,m,first[200010],next[500010],go[500010],w[500010],size[500010],tot=0; inline int R() {int i=0,f=1;char c;for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());if(c=='-')c=getchar(),f=-1;for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';return i*f; } inline int getfather(int a) {if(father[a]==a) return a;father[a]=getfather(father[a]);return father[a]; } inline void combfa(int a,int b) {father[getfather(a)]=getfather(b); } struct node {int from,go,val; }edge[400005]; inline bool comp(node a,node b) {return a.val<b.val; } inline void comb(int a,int b,int c) {next[++tot]=first[a],first[a]=tot,go[tot]=b,w[tot]=c;next[++tot]=first[b],first[b]=tot,go[tot]=a,w[tot]=c; } inline void dfs(int u,int fa) {size[u]=1;for(int e=first[u],v;e;e=next[e]){v=go[e];if(v==fa) continue;dfs(v,u);size[u]+=size[v];ans[w[e]]+=(long long)size[v]*(n-size[v]);cnt=max(cnt,w[e]);} }void work() {for(int i=0;i<=cnt;i++)if(ans[i]>1)ans[i+1]+=ans[i]/2,ans[i]%=2;int tmp=cnt+1;while(ans[tmp]>1)ans[tmp+1]+=ans[tmp]/2,ans[tmp++]%=2;cnt=tmp;for(int i=cnt;i>=0;i--)cout<<ans[i]; } int main() {//freopen("roads.in","r",stdin);//freopen("roads.out","w",stdout);n=R(),m=R(); int a,b,c;for(int i=1;i<=n;i++)father[i]=i;for(int i=1;i<=m;i++) {a=R();b=R();c=R();edge[i].from=a;edge[i].go=b;edge[i].val=c;}sort(edge+1,edge+m+1,comp);int cntt=0;for(int i=1;i<=m;i++) {if(getfather(edge[i].from)!=getfather(edge[i].go)){combfa(edge[i].from,edge[i].go);cntt++;comb(edge[i].from,edge[i].go,edge[i].val);}if(cntt==n-1) break;}dfs(1,0);work();return 0; }
转载于:https://www.cnblogs.com/AseanA/p/7221576.html
刷题总结——road(ssoi)相关推荐
- 重走长征路---OI每周刷题记录---8月16日 2014
总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
- 牛年前的一小结——打响本命年的第一枪,继续刷题!
经过一段时间的小尝试,摸索出了一点点头儿吧. 总结一下子. 关于面试的java,像我这个经验层次(1-2year普通厂)的都不会太难.最多超不出力扣中等难度. 多练习链表.树.指针类的比较基础的题目: ...
- 牛客网里刷题:JS获取输入的数组
有的时候我们刷题会遇到下面这种输入格式,那么用js怎么把它变成数组呢? [1,2,3,4,5] 难道用readline()之后在踢掉首尾的字符吗?这样也太麻烦了! 我发现了一个好用的方法: let l ...
- 【Leetcode】刷题之路2(python)
哈希映射类题目(简单题小试牛刀啦bhn) 242.有效的字母异位词 349.两个数组的交集 1002.查找常用字符 202.快乐数 383.赎金信 242. 有效的字母异位词 用python的Coun ...
- 【Leetcode】 刷题之路1(python)
leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...
- 力扣(LeetCode)刷题,简单+中等题(第35期)
力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升. 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /*** Note: ...
- 力扣(LeetCode)刷题,简单+中等题(第34期)
目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...
- 力扣(LeetCode)刷题,简单+中等题(第33期)
目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...
最新文章
- Linux下Flash-LED的处理
- 绝地求生 android版支持蓝牙吗,绝地求生怎么蓝牙耳机设置听脚步 | 手游网游页游攻略大全...
- 大量词云出现的时候IO的负担很大
- 互联网造富亲历者讲述:屌丝富了以后
- java字典树(Trie)实现中文模糊匹配
- ECStore在Win环境下如何运行CMD命令
- 十大笔记本品牌型号命名规则【三星、苹果、明基】
- JAVA多线程-CountDownLatch计数器
- python tab键自动补全_设置python中TAB键自动补全方法
- do...while(); 语句在宏定义中的应用。
- 侠客行java_MUDOS 侠客行100 MUDLIB 的一些摸索...
- 相关系数excel_excel函数利用CORREL函数FORECAST函数根据现有数据预测未来数据
- 深度解密天猫精灵对话系统
- 本本CPU控制让游戏3D效果最佳境界
- 怎么解决word中英文混合换行后字体间隔变大问题
- 干货:Spark RDD写入HBase 优化
- 记一次发现某餐饮企业二维码支付漏洞的经历
- 手机如何实现边有线上网边充电?
- 排序(基于Java语言编写)
- CentOS 8.2安装Raid卡驱动
热门文章
- Web开发之四:前后端开发模式探讨
- 无限循环小数四则运算_狐狸笔记 | 0.999999无限循环下去,就等于1吗?
- 一个C++工程内存泄漏问题的排查及重现工程
- USB HID学习:数据包分析
- 解决h264bitstream的一个bug
- 服务器怎么用u盘传文件进去_云服务器无法使用USB设备?一文读懂如何在云服务器上使用优盘...
- emqx http not found 怎么回事_幽默笑话:行倒是行,但两个大男人这么说话算怎么回事...
- 【Clickhouse】Clckhouse 视图 可以插入 但是查询不到
- 【Clickhosue】MySQL 没有主键导致CK不可用 The db.scene cannot be materialized, because there is no primary keys
- 【Kafka】kafka无法查看消费组消费信息,其他相关组件正常