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 ...
随机推荐
- 项目中PO、PM的职责区分
PO是product owner,是一个role,负责与stakeholders打交道,提炼stakeholders的需求,按照需求的价值以及紧急程度安排优先级.PO是一个角色,对product ba ...
- java基础 ---- 一维数组
为什么要使用数组: 因为不使用数组计算多个变量的时候太繁琐,不利于数据的处理. -------- 数组也是一个变量,是存储一组相同类型的变量 声明一个变量就是在内存中划出一块合适的空间 声明一个数 ...
- docker 容器 详解
docker run ## 创建一个新容器 [root@localhost ~]# docker run --help Usage: docker run [OPTIONS] IMAGE [COMM ...
- 基本HTML结构
配置:在vs code中声明页面为html,然后添加open in browser,view in browser插件通过快捷键alt+b实现在浏览器中查看编写好的html界面 基本成分: <! ...
- 【CSS】面试知识整理
手写clearfix .clearfix:after { content: ''; display: table; clear: both; } .clearfix { *zoom:; } flex布 ...
- JavaSE基础知识(7)—常用类
一.包装类 1.理解 java为八大基本数据类型一一对应提供了引用类型,方便使用里面的属性和方法 2.包装类型 byte——>Byteshort——>Shortint——>Integ ...
- Memcached和Memcache安装(64位win7)[z]
http://www.cnblogs.com/lucky-man/p/6126667.html 一.Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理 ...
- SpringMvc中Hashmap操作遇到 java.util.ConcurrentModificationException: null
代码按照网上修改为类似,还不能解决问题 for (Iterator<String> it = target.keySet().iterator(); it.hasNext(); ) { i ...
- OkHttp的get和post请求
OkHttp的get.Post 由于没有看过书籍,不能将理论正确的描述出来,只能根据自己的理解,带大家认识下java开发下的OkHttp的get和post两种请求方式. 依赖的包为:okio-1.15 ...
- mysql执行计划id为空—UNION关键字
简介 UNION 操作符用于合并两个或多个 SELECT 语句的结果集.例如,我有两个表,表1记录的是公司男员工的数据,包括年龄.姓名.职位.表2记录的是公司女员工的数据,包括姓名.家庭住址.手机号等 ...