题目:
题意:
我们需要给 m m m条直线染色,使得任意相交的两条直线的颜色不会相同,输出能否做到
分析:
我们将相交的直线变成两个点,将这两个点相连,把所有相交的直线转化后,我们就可以得到一张图
我们在这张图上用
d
f
s
dfs
dfs进行黑白染色就好了
代码:
#pragma GCC optimize(2)
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
struct node{
int l,r;
}e[1005];
bool cmp(node x,node y) {return x.l==y.l&&x.r<y.r||x.l<y.l;}
struct qwq{
int to,next;
}t[2000005];
int ls[2000005],cnt;
void add(int x,int y)
{
t[cnt]=(qwq){y,ls[x]};
ls[x]=cnt++;
return;
}
int tf[1005],king;
void dfs(int u)
{
if(king) return;
for(int i=ls[u];~i;i=t[i].next)
{
int v=t[i].to;
if(tf[v]) {if(tf[v]==tf[u]) {king=1;return;} continue;}
tf[v]=(tf[u]==1?2:1);
dfs(v);
}
return;
}
int main()
{
int q=read();
while(q--)
{
int n=read(),m=read();
cnt=0;memset(ls,-1,sizeof(ls));
for(int i=1;i<=m;i++)
{
int l=read(),r=read();
if(l>r) swap(l,r);
e[i].l=l;e[i].r=r;
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++)
for(int j=i+1;j<=m;j++)
{
if(e[j].l>=e[i].r) break;
if(e[i].l<e[j].l&&e[j].l<e[i].r&&e[i].r<e[j].r) add(i,j),add(j,i);
}
memset(tf,0,sizeof(tf));
int tt=0;
for(int i=1;i<=m;i++)
{
if(tf[i]) continue;
king=0;tf[i]=1;
dfs(i);
if(king) {tt=1;printf("non\n");break;}
}
if(!tt) printf("sane\n");
}
return 0;
}