NKOJ 4252 数三角形(乱搞)

博客介绍了如何计算一张无向完全图中,根据同色和异色三角形数量的多样性分数。给定图的边有三种颜色,红色、绿色和蓝色,异色三角形得3分,同色三角形扣6分。通过输入的顶点数和特定颜色边的数量,计算并输出图的多样性得分。样例输入和输出展示了计算过程。
摘要由CSDN通过智能技术生成

P4252数三角形

问题描述

刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决。给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色。现在,洁洁需要给这张图的多样性进行打分。一张图的多样性取决于它的同色和异色三角形的个数。具体来说,G 中每有一个三边颜色都互不同的三角形(异色三角形)可以得 3 分,每有一个三边颜色都相同的三角形(同色三角形)则要被扣掉 6 分,其它三角形不得分也不扣分。

现在,请你写一个程序来计算 G 的多样性分数。

输入格式

第一行两个正整数 n 和 m,其中 n 表示 G 中顶点的个数,m表示 G 中红色或者绿色的边的条数。

接下来 m行每行包括三个整数 a,b,c代表连接顶点 a和顶点 b的边颜色为红色 (c=1)或者绿色 (c=2)。

输出格式

一行G的多样性得分。

样例输入

4 3
1 2 1
1 3 1
2 3 1

样例输出

-6


此题纯属巧合。
Same 表示同色角的个数, Dif 表示异色角的个数,同时令

A=
B=
C=

那么有
Same=3×A+B
Dif=2×B+3×C
注意到我们要求的是 3×C6×A ,那么就等于 Dif2×Same

那么此题得解。


代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#define N 100005
#define ll long long
using namespace std;
ll n,m,cnt1,cnt2,cnt[N][3];
int main()
{
    ll i,j,x,y,z;
    scanf("%lld%lld",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%lld%lld%lld",&x,&y,&z);
        cnt[x][z]++;cnt[y][z]++;
    }
    for(i=1;i<=n;i++)
    {
        cnt[i][0]=n-1-cnt[i][1]-cnt[i][2];
        for(j=0;j<=2;j++)cnt1+=cnt[i][j]*(cnt[i][j]-1)/2;
        cnt2+=cnt[i][0]*cnt[i][1];
        cnt2+=cnt[i][0]*cnt[i][2];
        cnt2+=cnt[i][1]*cnt[i][2];
    }
    printf("%lld",cnt2-cnt1*2);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值