题目:

题目背景

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)相关推荐

  1. 重走长征路---OI每周刷题记录---8月16日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  2. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

  3. 牛年前的一小结——打响本命年的第一枪,继续刷题!

    经过一段时间的小尝试,摸索出了一点点头儿吧. 总结一下子. 关于面试的java,像我这个经验层次(1-2year普通厂)的都不会太难.最多超不出力扣中等难度. 多练习链表.树.指针类的比较基础的题目: ...

  4. 牛客网里刷题:JS获取输入的数组

    有的时候我们刷题会遇到下面这种输入格式,那么用js怎么把它变成数组呢? [1,2,3,4,5] 难道用readline()之后在踢掉首尾的字符吗?这样也太麻烦了! 我发现了一个好用的方法: let l ...

  5. 【Leetcode】刷题之路2(python)

    哈希映射类题目(简单题小试牛刀啦bhn) 242.有效的字母异位词 349.两个数组的交集 1002.查找常用字符 202.快乐数 383.赎金信 242. 有效的字母异位词 用python的Coun ...

  6. 【Leetcode】 刷题之路1(python)

    leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...

  7. 力扣(LeetCode)刷题,简单+中等题(第35期)

    力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升. 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /*** Note: ...

  8. 力扣(LeetCode)刷题,简单+中等题(第34期)

    目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...

  9. 力扣(LeetCode)刷题,简单+中等题(第33期)

    目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...

最新文章

  1. Linux下Flash-LED的处理
  2. 绝地求生 android版支持蓝牙吗,绝地求生怎么蓝牙耳机设置听脚步 | 手游网游页游攻略大全...
  3. 大量词云出现的时候IO的负担很大
  4. 互联网造富亲历者讲述:屌丝富了以后
  5. java字典树(Trie)实现中文模糊匹配
  6. ECStore在Win环境下如何运行CMD命令
  7. 十大笔记本品牌型号命名规则【三星、苹果、明基】
  8. JAVA多线程-CountDownLatch计数器
  9. python tab键自动补全_设置python中TAB键自动补全方法
  10. do...while(); 语句在宏定义中的应用。
  11. 侠客行java_MUDOS 侠客行100 MUDLIB 的一些摸索...
  12. 相关系数excel_excel函数利用CORREL函数FORECAST函数根据现有数据预测未来数据
  13. 深度解密天猫精灵对话系统
  14. 本本CPU控制让游戏3D效果最佳境界
  15. 怎么解决word中英文混合换行后字体间隔变大问题
  16. 干货:Spark RDD写入HBase 优化
  17. 记一次发现某餐饮企业二维码支付漏洞的经历
  18. 手机如何实现边有线上网边充电?
  19. 排序(基于Java语言编写)
  20. CentOS 8.2安装Raid卡驱动

热门文章

  1. Web开发之四:前后端开发模式探讨
  2. 无限循环小数四则运算_狐狸笔记 | 0.999999无限循环下去,就等于1吗?
  3. 一个C++工程内存泄漏问题的排查及重现工程
  4. USB HID学习:数据包分析
  5. 解决h264bitstream的一个bug
  6. 服务器怎么用u盘传文件进去_云服务器无法使用USB设备?一文读懂如何在云服务器上使用优盘...
  7. emqx http not found 怎么回事_幽默笑话:行倒是行,但两个大男人这么说话算怎么回事...
  8. 【Clickhouse】Clckhouse 视图 可以插入 但是查询不到
  9. 【Clickhosue】MySQL 没有主键导致CK不可用 The db.scene cannot be materialized, because there is no primary keys
  10. 【Kafka】kafka无法查看消费组消费信息,其他相关组件正常