题目

 
 
 
 

分析

 

  • 首先我们暴力找出两条线是否相交
  • 然后对边进行编号
  • 相交两边连边
  • 然后跑dfs 0,1染色即可

代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<string>
 7 using namespace std;
 8 int T,n,m,color[1007];
 9 int cnt,head[1007],next[2000007],rea[2000007];
10 struct sb
11 {
12     int l,r;
13 }a[1007];
14
15 bool check(int i,int j)
16 {
17     if (a[i].r<=a[j].l||a[j].r<=a[i].l) return 0;
18     if (a[i].l<=a[j].l&&a[i].r>=a[j].r) return 0;
19     if (a[i].r<=a[j].r&&a[i].l>=a[j].l) return 0;
20     return 1;
21 }
22 struct A
23 {
24     int to,nx;
25 }g[100001];
26 int list[10001];
27 void add(int u,int v)
28 {
29     g[++cnt].to=v; g[cnt].nx=list[u]; list[u]=cnt;
30 }
31
32 void dfs(int u)
33 {
34     for (int i=list[u];i;i=g[i].nx)
35     {
36         int v=g[i].to;
37         if (color[v]==-1)
38         {
39             color[v]=color[u]^1;
40             dfs(v);
41         }
42     }
43 }
44 int main()
45 {
46     scanf("%d",&T);
47     while (T--)
48     {
49         cnt=0;
50         memset(list,0,sizeof(list));
51         memset(color,-1,sizeof(color));
52         scanf("%d%d",&n,&m);
53         for (int i=1;i<=m;i++)
54         {
55             scanf("%d%d",&a[i].l,&a[i].r);
56             if (a[i].l>a[i].r) swap(a[i].l,a[i].r);
57             for (int j=1;j<i;j++)
58                 if (check(i,j))
59                 {
60                     add(i,j);
61                     add(j,i);
62                 }
63         }
64         for (int i=1;i<=m;i++)
65             if (color[i]==-1)
66             {
67                 color[i]=0;
68                 dfs(i);
69             }
70         int flag=0;
71         for (int i=1;i<=m;i++)
72         {
73             for (int j=list[i];j;j=g[j].nx)
74             {
75                 int u=i,v=g[j].to;
76                 if (color[u]==color[v])
77                 {
78                     flag=1;
79                     break;
80                 }
81             }
82             if (flag==1) break;
83         }
84         if (flag==1) printf("non\n");
85         else printf("sane\n");
86     }
87 }
12-27 13:12