题意:~
思路:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PI;
const int MAXN = 10020;
const int MAXM = 5000010;
struct Edge
{
int to,next;
}edge[MAXM];
int head[MAXN],tot;
void init()
{
tot = 0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v)
{
edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++;
}
bool vis[MAXN];
int S[MAXN],top;
bool dfs(int u)
{
if(vis[u^1])return false;
if(vis[u])return true;
vis[u] = true;
S[top++] = u;
for(int i = head[u];i != -1;i = edge[i].next)
if(!dfs(edge[i].to))
return false;
return true;
}
bool Twosat(int n)
{
memset(vis,false,sizeof(vis));
for(int i = 0;i < n;i += 2)
{
if(vis[i] || vis[i^1]) continue;
top = 0;
if(!dfs(i))
{
while(top)vis[S[--top]] = false;
if(!dfs(i^1)) return false;
}
}
return true;
}
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
int co[1005];
vector<int> eg[1005];
struct point
{
double x, y;
} nd[1005];
struct line
{
point a, b;
int id;
} li[1005];
double xmult(point p1, point p2, point p0)
{
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
int dots_inline(point p1, point p2, point p3)
{
return zero(xmult(p1, p2, p3));
}
int dot_online_in(point p, point l1, point l2)
{
return zero(xmult(p, l1, l2)) && (l1.x - p.x) * (l2.x - p.x) < eps && (l1.y - p.y) * (l2.y - p.y) < eps;
}
int same_side(point p1, point p2, point l1, point l2)
{
return xmult(l1, p1, l2) * xmult(l1, p2, l2) > eps;
}
int intersect_in(point u1, point u2, point v1, point v2)
{
if (!dots_inline(u1, u2, v1) || !dots_inline(u1, u2, v2))
return !same_side(u1, u2, v1, v2) && !same_side(v1, v2, u1, u2);
return
dot_online_in(u1, v1, v2) || dot_online_in(u2, v1, v2) || dot_online_in(v1, u1, u2) || dot_online_in(v2, u1, u2);
}
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
init();
for(int i = 1; i <= n; i++)
{
eg[i].clear();
co[i] = 0;
}
for(int i = 1; i <= n; i++) scanf("%lf%lf", &nd[i].x, &nd[i].y);
for(int i = 1; i <= m; i++)
{
scanf("%d%lf%lf", &li[i].id, &li[i].b.x, &li[i].b.y);
li[i].a = nd[li[i].id];
}
for(int i = 1; i <= m; i++)
{
for(int j = i + 1; j <= m; j++)
{
if(li[i].id == li[j].id)
continue;
if(intersect_in(li[i].a, li[i].b, li[j].a, li[j].b))
{
int u = i - 1, v = j - 1;
u *= 2, v *= 2;
addedge(u, v ^ 1);
addedge(v, u ^ 1);
addedge(u ^ 1, v);
addedge(v ^ 1, u);
}
}
}
if(Twosat(2 * m)) puts("possible");
else puts("impossible");
}
return 0;
}
/*
2 3
0 0
0 10
1 5 15
1 2 15
2 10 10
*/
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/1415 (转载时请注明本文出处及文章链接)


发表评论
快来吐槽一下吧!