Ural 1966 Cycling Roads
Description
Input
Output
Sample Input
| input | output |
|---|---|
4 2 |
YES |
4 3 |
NO |
3 2 |
YES |
这道题主要是判相交,只要相交就把它压入并查集,一开始我是用了cnt去记录已经相交的节点,后来发现不行,因为新加如的一条线如果加进去了,它的另外一个端点也会加入,导致cnt记录的数值不准。于是用了另外一个数组c[i]去记录以i为根的所有子节点的个数。
在判断相交这里,一开始没有注意到新加入一条线段时,应该判断所有点是否在该线段上,如果端点在该线段上,则把它加入,加了OnSegment()判断之后就AC了。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
#define maxn 205
struct point
{
double x,y;
point(double x = ,double y = ):x(x),y(y){}
}p[maxn]; struct Line
{
point a,b;
int pos1,pos2;
Line(){}
Line(point x,point y,int ppos1,int ppos2){ a = x; b = y; pos1 = ppos1; pos2 = ppos2;}
}line[maxn]; int n,m,cnt;
int par[maxn];
int c[maxn]; typedef point Vector;
Vector operator +(Vector A,Vector B){ return Vector(A.x+B.x, A.y+B.y); }
Vector operator -(Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }
Vector operator *(Vector A,double p) { return Vector(A.x*p,A.y*p); }
Vector operator /(Vector A,double p){ return Vector(A.x/p,A.y/p); }
const double eps = 1e-;
int dcmp(double x)
{
if(fabs(x) < eps) return ;
else return x < ? -:;
}
bool operator == (const point &a,const point &b)
{
return dcmp(a.x-b.x) == && dcmp(a.y-b.y) == ;
}
double dot(Vector A,Vector B){ return A.x*B.x + A.y*B.y; }
double cross(Vector A,Vector B){ return A.x*B.y-A.y*B.x; } bool OnSegment(point p,Line l)
{
return dcmp(cross(l.a-p,l.b-p)) == && dcmp(dot(l.a-p,l.b-p)) < ;
}
bool SegmentProperIntersection(Line l1,Line l2)
{
point a1 = l1.a;
point a2 = l1.b;
point b1 = l2.a;
point b2 = l2.b;
double c1 = cross(a2-a1,b1-a1);
double c2 = cross(a2-a1,b2-a1);
double c3 = cross(b2-b1,a1-b1);
double c4 = cross(b2-b1,a2-b1);
return dcmp(c1)*dcmp(c2) < && dcmp(c3)*dcmp(c4) < ;
} void init()
{
for(int i = ; i <= n; i++)
c[i] = ;
for(int i = ; i < maxn;i++)
par[i] = i;
}
int Find(int x)
{
if(par[x] != x)
{
return par[x]=Find(par[x]);
}
else return x;
} void Merge(int a,int b)
{
int t1 = Find(a);
int t2 = Find(b);
if(t1 != t2)
{
par[t2] = t1;
c[t1] += c[t2];
//printf("%d %d merge\n",a,b);
//return 1;
}
//return 0;
} void input()
{
int x,y; for(int i = ; i <= n; i++)
{
double x,y;
scanf("%lf%lf",&x,&y);
p[i] = point(x,y);
}
for(int i = ; i < m; i++)
{
scanf("%d%d",&x,&y);
line[i] = Line(p[x],p[y],x,y);
for(int j = ; j <= n; j++)
{
if(OnSegment(p[j],line[i])) Merge(j,x);
}
Merge(x,y);
}
} void deal()
{
for(int i = ; i < m; i++)
{
for(int j = i + ; j < m; j++)
{
if(SegmentProperIntersection(line[i],line[j]))
{
Merge(line[j].pos1,line[i].pos1);
//Merge(line[j].pos2,line[i].pos1);
}
}
} } int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m) == )
{
init();
input();
deal();
if(c[Find()] == n) printf("YES\n");
else printf("NO\n");
} return ;
}
Ural 1966 Cycling Roads的更多相关文章
- URAL 1966 Cycling Roads 点在线段上、线段是否相交、并查集
F - Cycling Roads Description When Vova was in Shenzhen, he rented a bike and spent most of the ...
- URAL 1966 Cycling Roads 计算几何
Cycling Roads 题目连接: http://acm.hust.edu.cn/vjudge/contest/123332#problem/F Description When Vova was ...
- URAL - 1966 - Cycling Roads(并检查集合 + 判刑线相交)
意甲冠军:n 积分,m 边缘(1 ≤ m < n ≤ 200),问:是否所有的点连接(两个边相交.该 4 点连接). 主题链接:http://acm.timus.ru/problem.aspx? ...
- Cycling
Cycling Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Ural 1004 Sightseeing Trip
Sightseeing Trip Time Limit: 2000ms Memory Limit: 16384KB This problem will be judged on Ural. Origi ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
- Jungle Roads[HDU1301]
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- POJ1947 Rebuilding Roads[树形背包]
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11495 Accepted: 5276 ...
- Constructing Roads——F
F. Constructing Roads There are N villages, which are numbered from 1 to N, and you should build som ...
随机推荐
- c# int类型的转datetime类型
int a =20190319; DateTime b = DateTime.ParseExact(a.tostring(),"yyyyMMdd",System.Globali ...
- windows server 2012R2 故障转移集群配置
配置说明: AD:10.10.1.10/24 Node-2:10.10.1.20/24 Node-3:10.10.1.30/24 zhangsan-PC:10.10.1.50/24 VIP1:10 ...
- gerapy 实现自动化部署
1 安装 2 在需要部署的目录下运行 gerapy init 会在当前目录下生成一个gerapy目录,并在gerapy目录下有一个projects 目录 3 切换到gerapy 目录 cd gerap ...
- linux下搭建Jenkins环境
前提:Tomcat.jdk已安装并配置成功,具体安装和配置可参考我的其他随笔,在此不再详述 1.官网下载Jenkins最新war包,jenkins.war 2.进入Tomcat安装目录,创建Jenki ...
- matplotlib 绘图报错 RuntimeError: Invalid DISPLAY variable
ssh 远程登录 Linux 服务器使用 matplotlib.pyplot 绘图时报错 原因: matplotlib 在 windows 下的默认 backend 是 TkAgg:在 Linux 下 ...
- python 数据可视化 -- matplotlib02
import matplotlib.pyplot as plt import numpy as np x = np.linspace(start=0.5, stop=3.5, num=100) y = ...
- .NET framework访问Oracle的几种方法
首先介绍下开发环境:WIn10 64bit+Visual Studio 2015+Oracle10ClientWin32(只是客户端,如果安装整个数据库也是可以的) 目前了解C#中连接Oracle数据 ...
- jsp页面的html代码显示不出来,提示Uncaught SyntaxError: Unexpected token <
jsp页面的html代码显示不出来,提示Uncaught SyntaxError: Unexpected token < <input type="hidden" na ...
- Unity3D 中 脚本(MonoBehaviour) 生命周期WaitForEndOfFrame需要注意的地方
首先看看MonoBehaviour的生命周期 先上个图(来源 http://blog.csdn.net/qitian67/article/details/18516503): 1.Awake 和 St ...
- C++ openmp并行程序在多核linux上如何最大化使用cpu
以上代码中,#pragma omp parallel for 这一行的作用即是调用openmp的功能,根据检测到的CPU核心数目,将for (i = 0; i < 1000000000; i++ ...