JZOJ 3846. 七天使的通讯(angelus)
题目
分析
- 首先我们暴力找出两条线是否相交
- 然后对边进行编号
- 相交两边连边
- 然后跑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 }
为何要逼自己长大,去闯不该闯的荒唐