JZOJ 1714. 小x的三角形(triangles.pas/cpp)

本文探讨了在完全无向图中,通过选取特定数量的边形成子图后,如何计算由这些边构成的三角形总数的问题。给出了具体的算法实现,并通过示例详细解释了计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
       小x和小o在一起研究各种图形的性质。小x发明了一个问题:一个完全无向图有n个顶点,选择m条边得到它们,并将剩余的   条边给小o。

       小x和小o喜欢图中的三角形,他们想知道他们得到的边所形成的图共形成了多少个三角形。

       图的顶点从1到n编号。
输入
       第一行包含两个用空格隔开的整数n和m,分别表示顶点数和小x选取的边数。

       接下来m行每行两个整数ai,bi,表示小x选取的第i条边连接顶点ai,bi,数据保证小x得到的图和初始的完全图无重       边和自环。
输出
输出一行一个整数,小x和小o得到的图所包含三角形的总数。
样例输入input1:
5 5
1 2
1 3
2 3
2 4
3 4




input2:

5 3
1 2
2 3
1 3

样例输出
output1:
3
output2:
4
数据范围限制
【数据范围】

对于20%的数据 1<=n<=20

对于60%的数据 1<=n<=100

对于100%的数据 1<=n<=20000, 0<=m<=10^6,m<=n(n-1)/2,1<=ai,bi<=n,ai≠bi
提示
【样例解释】

第一个样例,小x得到的图有两个三角形:(1,2,3)和(2,3,4),小o有一个三角形(1,4,5),所以总数是3。

第二个样例,小x的图只有一个三角形(1,2,3),小o的图有3个三角形(1,4,5),(2,4,5)和(3,4,5),所以总数是4。

 

Idea from lyx & zyf ;

 借助几天前的一题来解释吧,我们可以把小x的边看做图中的实边,小o的边看做图中的虚边

他们两人所有的三角形就是同为虚边或者同为实边的种数之和, 具体求法如上:

P.S. 其实是CATALAN。。。。

 

 1 {
 2     by @bobble !
 3                     2017-1-19
 4 }
 5 program triangles;
 6 const
 7   inf='triangles.in';
 8   outf='triangles.out';
 9 var
10    s,e,i,n,m:longint;
11    ans,c,aaa:int64;
12    yes:array[0..20000] of longint;
13 begin
14   assign(input,inf);
15   assign(output,outf);
16   reset(input); rewrite(output);
17 
18   readln(n,m);
19   for i:= 1 to m do
20     begin
21          readln(s,e);
22          inc(yes[s]);
23        inc(yes[e]);
24     end;
25   for i:= 1 to n do 
26     c:=c+yes[i]*(n-yes[i]-1);
27   c:=c div 2;
28   aaa:=n*(n-1)*(n-2) div 6;
29   ans:=aaa-c;
30   writeln(ans);
31 
32   close(input);
33   close(output);
34 end.

 

转载于:https://www.cnblogs.com/bobble/p/6308628.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值