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 ...
随机推荐
- jemter聚合报告参数指标
1.聚合报告指标含义 2.性能指标的名称与含义 1)并发: 所有用户在同一时刻对系统执行操作,一般指做同一件事情或操作.2)在线: 所有用户在一段时间内对系统执行操作.3) ...
- C#入门课程之基础认识
命名规则: 注意变量名的第一个字符必须是字母.下划线.以及@字符 字面值: 字符串字面值: 用Unicode表示一个字符方式:\uxxxx,其中xxxx表示4位的十六进制数,下面两种表示方式一致: u ...
- Linux 对信号的总结
Linux信号_总结 对信号本质的理解: 类似于中断,区别在于中断是由硬件产生的,而信号是由软件实现的. 信号的来源: 触发硬件(触发键盘,或是硬件故障):软件信号函数kill .alarm.seti ...
- python day03_ 文件处理
一.文件操作的基本流程 计算机操作文件的过程 #1. 打开文件,得到文件句柄并赋值给一个变量 #2. 通过句柄对文件进行操作 #3. 关闭文件 1.文件的打开过程 # f被程序持有,文件被操作系统持有 ...
- SummerNote 富文本编辑器 - Rails 集成
使用官方提供的CDN服务 将下面一段加入layout文件中 <link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css ...
- 查看linux是否为虚拟机,以及其它信息,cpu,主机型号,主板型号等
dmidecode -s system-product-name 物理机: [root@swnode1]# dmidecode -s system-product-name I840-GS 虚拟机: ...
- C++概念小结
API:应用程序编程接口 SDK:软件开发包 调用程序是通过消息来进行的 事件驱动方式的程序设计模式,主要是基于消息的.消息,是由MSG结构体表示的. 消息队列:用来存放该程序创建的窗口的消息 Win ...
- c语言实验一
#include <stdio.h> int main(){ int a,b,sum; a=123; b=456; sum = a + b; printf("sum is %d\ ...
- 文件操作命令(del)
del 命令: // 描述: 删除一个或多个文件.同等于 erase 命令. 相比较 rd 命令来说,del 命令只能删除文件,不能删除文件夹. // 语法: del [/p] [/f] [/s] [ ...
- nodeJS接入微信公众平台开发
一.写在前面的话 Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...