1010: Triangles

Time Limit: 2 Sec   Memory Limit: 128 MB

Submit: 18  
Solved: 8

Description

You are given a figure consisting of n points in a 2D-plane and m segments connecting some of them. We guarantee that any two segments don’t share points except their ends and there’s no more than one segment between the same pair of points. Please count the total number of triangles in the given figure.

Input

There’re multiple test cases. In each case:
The first line contains two positive integers n and m. (n ≤ 200, m ≤ 20000)

Each of the following n lines contains two real numbers xi and yi indicating the coordinates of the i-th point. (−100000 < xi, yi < 100000)

Each of the following m lines contains four real numbers xi, yi, xj, yj . It means (xi,yi) and (xj,yj) are connected by a segment. We guarantee that these points are part of the given n points.

Output

For each test case, print a single line contains the total number of triangles in the given figure.

Sample Input

4 5
0 0
1 1
2 0
1 0
0 0 1 1
1 1 2 0
2 0 1 0
1 0 0 0
1 1 1 0

Sample Output

3

思路:题意是给你n个点,在这n个点里有m条连线,求这些线段最后组成多少个三角形。题目想好怎么做就不难了,大致就是先找出:三点在一条线上,但是只有两条连线,你必须找出这样的例子,并且把第三条线段加上,然后就是遍历所有的点,三点之间有连线且不共线,则组成三角形。
代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<map>
#include<cstring>
using namespace std;
const unsigned int MAX=200;
#define ERR 0.000001
struct Point
{
double x,y;
}point[MAX+10];
int edge[MAX+10][MAX+10];
map <double,int> mymap;
bool in_line(Point a1,Point a2,Point a3)//判断是否共线
{
if(fabs((a2.x-a1.x)*(a3.y-a2.y)-(a2.y-a1.y)*(a3.x-a2.x))<=ERR)
return true;
return false;
}
int main()
{
//freopen("Triangles.in","r",stdin);
int m,n,i,j,k,ans;
int u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
mymap.clear();
memset(edge,0,sizeof(edge));
ans=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&point[i].x,&point[i].y);
mymap[point[i].x*20000+point[i].y]=i;
}
for(i=0;i<m;i++)
{
double p1,q1,p2,q2;
scanf("%lf%lf%lf%lf",&p1,&q1,&p2,&q2);
u=mymap[p1*20000+q1];
v=mymap[p2*20000+q2];
//printf("u==%d v==%d\n",u,v);
edge[u][v]=edge[v][u]=1;//点与线之间联系起来
}
/*for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
printf("edge[%d][%d]=%d ",i,j,edge[i][j]);
}
printf("\n");
}*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
if(i!=j&&j!=k&&i!=k&&edge[j][i]&&edge[i][k]&&!edge[j][k]&&in_line(point[i],point[j],point[k]))
edge[j][k]=edge[k][j]=1;//三个点中,有两条连线,并且三点共线,加一条连线
/*for(i=0;i<n;i++)//这种方法貌似可以,并且复杂度较低,但就是通不过,不知为啥
for(j=i+1;j<n;j++)
for(k=j+1;k<n;k++)
{
//printf("point[%d] x=%lf y=%lf ",i,point[i].x,point[i].y);
//printf("point[%d] x=%lf y=%lf ",j,point[j].x,point[j].y);
//printf("point[%d] x=%lf y=%lf \n",k,point[k].x,point[k].y);
if(in_line(point[i],point[j],point[k]))
{
if((edge[i][j]&&(edge[j][k]||edge[i][k]))||(edge[j][k]&&edge[i][k]))
edge[i][j]=edge[i][k]=edge[j][k]=edge[j][i]=edge[k][i]=edge[k][j]=1;
}
}*/
for(i=0;i<n;i++)//扫描所有点,三点两两之间有连线,且不共线,则组成三角形
for(j=i+1;j<n;j++)
for(k=j+1;k<n;k++)
{
if(edge[i][j]&&edge[i][k]&&edge[j][k]&&!in_line(point[i],point[j],point[k]))
ans++;
}
printf("%d\n",ans);
}
return 0;
}

FROM:暑假训练第二场

Triangles的更多相关文章

  1. Count the number of possible triangles

    From: http://www.geeksforgeeks.org/find-number-of-triangles-possible/ Given an unsorted array of pos ...

  2. [ACM_搜索] Triangles(POJ1471,简单搜索,注意细节)

    Description It is always very nice to have little brothers or sisters. You can tease them, lock them ...

  3. acdream.Triangles(数学推导)

    Triangles Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu Submit Stat ...

  4. UVA 12651 Triangles

    You will be given N points on a circle. You must write a program to determine how many distinctequil ...

  5. Codeforces Gym 100015F Fighting for Triangles 状压DP

    Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...

  6. Codeforces Round #309 (Div. 1) C. Love Triangles dfs

    C. Love Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/553/pro ...

  7. Codeforces Round #308 (Div. 2) D. Vanya and Triangles 水题

    D. Vanya and Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55 ...

  8. Project Euler 94:Almost equilateral triangles 几乎等边的三角形

    Almost equilateral triangles It is easily proved that no equilateral triangle exists with integral l ...

  9. Project Euler 91:Right triangles with integer coordinates 格点直角三角形

    Right triangles with integer coordinates The points P (x1, y1) and Q (x2, y2) are plotted at integer ...

  10. Project Euler 75:Singular integer right triangles

    题目链接 原题: It turns out that 12 cm is the smallest length of wire that can be bent to form an integer ...

随机推荐

  1. jquery ui autoComplete自动完成

    官网:http://jqueryui.com/autocomplete 最简单的形式: var availableTags = [ "ActionScript", "Ap ...

  2. C# Process.Kill() 拒绝访问(Access Denied) 的解决方案

    需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常 ...

  3. LeetCode Power of Two (2的幂)

    题意:判断1个数n是否刚好是2的幂,幂大于0. 思路:注意会给负数,奇数.对于每个数判断31次即可. class Solution { public: bool isPowerOfTwo(int n) ...

  4. BingWallpaper

    桌面壁纸更换成Bing.com的每日图片 项目地址:https://github.com/atskyline/BingWallpaper 其实就只是一个脚本,只是觉得二进制文件使用比较方便,所以采用C ...

  5. 剑指Offer:打印从1到最大的n位数

    题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...

  6. 彩色网页变黑白色CSS代码变黑白色调!

    <style> html { -webkit-filter: grayscale(%); -moz-filter: grayscale(%); -ms-filter: grayscale( ...

  7. SharePoint 2010 获取列表中所有数据(包括文件夹内)的方法

    转: http://blog.csdn.net/wangwenism/article/details/8751411 SharePoint的列表能存储文件以及文件夹,用户使用的时候,经常会建几个分类文 ...

  8. toastr

    $(function(){     //参数设置,若用默认值可以省略以下面代     toastr.options = {         "closeButton": false ...

  9. Appium原理

    Appium原理小结 Api接口调用selenium的接口,android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的) ...

  10. uvalive 4992 Jungle Outpost

    题意:一个凸边型,目标在凸边型内且最优.问最多删除几个点使目标暴露在新凸边型外面. 思路:二分+半平面相交. #include<cstdio> #include<cmath> ...