Codeforces Round #142 (Div. 1) C. Triangles

来源:互联网 发布:淘宝联盟二维码分享 编辑:程序博客网 时间:2024/06/12 01:16

题意

        有一个无向完全图(任意两个节点之间均有一条边),包含 n(1<=n<=10^6) 个顶点,现在有两个人A 和 B,A从这个无向图中取出 m(0<=m<=10^6) 条边出来,这样就把真个完全图分成了两个子图 A 和 B,要求统计两个子图中总共含有的“三角形”的个数。“三角形”的意思说的就是一个含有三个节点的环

做法分析

        直接计算的话比较麻烦,没什么思路,我们可以这样考虑:
                1、整个完全图在最初的时候(没有被 A 取走 m 条边)总共有 n*(n-1)*(n-2)/6 条边
                2、分成了两个部分之后,“残缺的三角形”的形状只有以下两种:
                                    
                不可能出现有三条边(属于A)或者0条边(属于B)的情况
        现在的问题就转化成了怎么计算出这种三角形的个数了,我们通过观察可以发现,上面的两种三角形中有一个共性:有两个顶点,和他们相邻的两条边中,一条属于 A,一条属于 B ,好了,思路出来了:
        对每个顶点 u,计算他在 A 中含有的边 edge_A 和在 B 中含有的边 edge_B,用 edge_A * edge_B 得到残缺三角形的个数。
        注意:由于每个顶点都计算了一次,而一个三角形中含有两个这样的顶点,于是最终得到的残缺三角形数量要除以2

AC快速通道

        http://codeforces.com/problemset/problem/229/C

代码

#include <iostream>#include <cstdio>#include <cstring>using namespace std;long long d[1000001], ans;int n, m;int main(){    scanf("%d%d", &n, &m);    for(int i=1; i<=n; i++)d[i]=0;    for(int i=0, a, b; i<m; i++)    {    scanf("%d%d", &a, &b);    d[a]++;    d[b]++;    }    ans=0;    for(int i=1; i<=n; i++)ans+=d[i]*(n-1-d[i]);printf("%I64d\n", (long long)n*(n-1)*(n-2)/6-ans/2);    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝提前确认收货了怎么办已经发货 苹果支付安全提示问题忘记了怎么办 没有在规定日期交首付款怎么办 淘宝申请退款又不想退了怎么办 淘宝申请退款后又不想退了怎么办 申请退款后如果不想退了怎么办 世纪明德申请退款但不想退了怎么办 天猫申请换货商家不换怎么办 乐视手机刷机不想清除数据怎么办 捡的苹果手机刷机了要id怎么办 苹果6plus玩王者荣耀卡怎么办 华为荣耀3c的手机内存不足怎么办 红米4x玩王者荣耀卡怎么办 华为手机荣耀10一直重启怎么办 荣耀9青春版老自动重启怎么办 手机开不开机停在华为界面怎么办 华为荣耀9老是反复的重启怎么办 华为荣耀4x老是反复的重启怎么办 手机更新系统后开不了机怎么办 荣耀畅玩7x没有4g网络怎么办 华为4x数字解锁不对中怎么办 华为手机需要解锁后才能刷机怎么办 畅玩6x锁屏壁纸黑了怎么办 指纹密码解锁的手机解不开了怎么办 客户说物流太慢了要退货怎么办 天猫买的手机商家不给发票怎么办 天猫超市下单付款后缺货怎么办 淘宝卖家填写假的单号不发货怎么办 天猫商家72小时未发货怎么办 天猫精灵方糖不按顺序播放怎么办 在天猫购物已付款不发货怎么办 淘宝退货商家收到货不退款怎么办 被有实名认证的闲鱼卖家骗了怎么办 我收到了方正的提示函怎么办 淘宝刷q币单被骗了怎么办 中通快递已签收但是东西丢了怎么办 手机不版本低不支持微信下载怎么办 淘宝虚拟商品不支持7天退货怎么办 卖虚拟物品遇到恶意退款买家怎么办 淘宝极速退款后卖家拒绝退款怎么办 我的天猫积分不让换券了怎么办