POJ-1127
来源:互联网 发布:汇贷天下网络贷款 编辑:程序博客网 时间:2024/06/15 21:44
线段相交加并查集。
#include <cstdio>#include <cmath>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const double eps = 1e-10;struct P{ double x, y; P() {} P(double x, double y) : x(x), y(y) {} int dcmp(double k) { if(fabs(k) < eps) return 0; else return x < 0 ? -1 : 1; } P operator + (const P &q) { return P(x + q.x, y + q.y); } P operator - (const P &q) { return P(x - q.x, y - q.y); } P operator * (const double &d) { return P(x * d, y * d); } bool operator == (const P &q) { return dcmp(x - q.x) == 0 && dcmp(y - q.y) == 0; } double dot(const P &q) { return x * q.x + y * q.y; } double det(const P &q) { return x * q.y - y * q.x; }};P start[200], fine[200];int pre[200], rankc[200];void init(){ int i; memset(start, 0, sizeof(start)); memset(fine, 0, sizeof(fine)); memset(rankc, 0, sizeof(rankc)); for(i = 0; i <= 190; ++i) { pre[i] = i; }return ;}inline bool on_point(P p, P q){ return p == q;}inline bool on_seg(P p1, P p2, P q){ return (q - p1).det(p2 - q) == 0 && (q - p1).dot(p2 - q) >= 0;}inline bool on_inster(P p1, P p2, P q1, P q2){ return ((p1 - q2).det(q1 - q2)) * ((q1 - q2).det(p2 - q2)) > 0 && ((q1 - p2).det(p1 - p2)) * ((p1 - p2).det(q2 - p2)) > 0;}int findc(int x){ if(x != pre[x]) { return pre[x] = findc(pre[x]); } else return pre[x];}void unionc(int x, int y){ x = findc(x), y = findc(y); if(x == y) return ; else { if(rankc[x] < rankc[y]) { pre[x] = y; } else { pre[y] = x; if(rankc[x] == rankc[y]) { rankc[x] += 1; } } }return ;}int main(){ int n, i, j, k; while(scanf("%d", &n) != EOF) { if(n == 0) break; init(); for(i = 1; i <= n; ++i) { scanf("%lf %lf %lf %lf", &start[i].x, &start[i].y, &fine[i].x, &fine[i].y); } for(i = 1; i <= n; ++i) { for(j = i + 1; j <= n; ++j) { if(on_point(start[i], start[j]) || on_point(start[i], fine[j]) || on_point(fine[i], start[j]) || on_point(fine[i], fine[j])) { unionc(i, j); } else if(on_seg(start[i], fine[i], start[j]) || on_seg(start[i], fine[i], fine[j]) || on_seg(start[j], fine[j], start[i]) || on_seg(start[j], fine[j], fine[i])) { unionc(i, j); } else if(on_inster(start[i], fine[i], start[j], fine[j])) { unionc(i, j); } } } while(1) { int a, b; scanf("%d %d", &a, &b); if(a == 0 && b == 0) break; if(findc(a) == findc(b)) printf("CONNECTED\n"); else printf("NOT CONNECTED\n"); } }return 0;}
0 0
- POJ 1127
- POJ-1127
- poj 1127
- POJ 1127
- POJ 1127 Jack Straws
- poj 1127 Jack Straws
- poj 1127(线段相交)
- poj 1127 Jack Straws
- POJ 1127_Jack Straws
- poj--1127 Jack Straws
- poj 1127 Jack Straws
- Jack Straws Poj 1127
- poj 1127 计算几何
- POJ
- poj
- POJ
- POJ
- poj
- jQuery支持触摸屏设备的响应式幻灯片插件
- 写给自己的第一篇博文
- P52 第25题 求解方程根问题
- C++Builder控制Excel
- ZOJ 3058 Circle and Ring(圆和圆环的相交面积)
- POJ-1127
- BITMAPINFO结构
- jQuery超有趣的白云飘动特效插件
- 构造函数与其他类方法的区别
- Struts2的ActionContext
- 设计模式--工厂模式和抽象工厂模式
- MYSQL存储过程&&JAVA读取结果集
- c++builder 中设置 excel表中单元格为超链接
- MFC第七天