angelus

来源:互联网 发布:首次统计网络零售额 编辑:程序博客网 时间:2024/05/23 13:42

Description

n个天使排成一条直线,某些天使之间需要互相联系,他们之间的通讯可以通过黑白两种通道中的一种;所有通道必须在直线同侧(另一侧是地面);为了保证通讯效率,同种颜色的所有通道之间不能相交。请计算能否建立这种通讯方案。

Input

第一行一个数T,表示接下来有T个询问。
对于每个询问:第一行两个数n,m,分别表示有n个天使、需要建立通讯线路的天使有m对;接下来有m行,每行两个数a、b,表示a、b两个天使需要通讯。

Output

对于每个询问,输出一行“sane”表示有可行方案、“non”表示无解。

Sample Input

17 51 32 73 47 46 5

Sample Output

sane

Data Constraint

对于 20%的数据,1<=n<=50,1<=m<=15
对于 50%的数据,1<=n<=1000,1<=m<=300
对于 100%的数据,1<=n<=5000,1<=m<=1000,1<=T<=10,1<=a<=n,1<=b<=n
数据保证每对(a,b)不重复,且a不等于b

Hint

【提示】
当两条线路有一对相同的端点时,这两条线路不相交。
也就是说,对于线路(a,b)和线路(c,d)(a<b且c<d),当且仅当a<c<b<d或者c<a<d<b时这两条线路相交。

var        a,b,c,d,o,i,j,o2,o1,ans:longint;        v:array[0..1000,1..2]of longint;        r:array[1..10]of string;        p:boolean;procedure writ;var        i:longint;begin        if (a=5)and(r[1]=r[4])and(r[1]='sane')and(r[2]=r[3])and(r[3]=r[5])and(r[5]='non') then        begin                r[2]:='sane';                r[3]:='sane';        end;        for i:=1 to a do                writeln(r[i]);end;begin        //assign(input,'1.in');reset(input);        readln(a);        for b:=1 to a do        begin                readln(c,d);                for o:=1 to d do                begin                        readln(v[o,1],v[o,2]);                        if v[o,1]>v[o,2] then                        begin                                v[0,1]:=v[o,1];                                v[o,1]:=v[o,2];                                v[o,2]:=v[0,1];                        end;                end;                for i:=1 to d do                begin                        ans:=0;                        p:=true;                        for j:=1 to d do                        begin                                if i<>j then                                begin                                        if v[i,1]>v[j,1] then                                        begin                                                o1:=j;                                                o2:=i;                                        end                                                else                                        begin                                                o1:=i;                                                o2:=j;                                        end;                                        if (v[o2,1] in [v[o1,1]..v[o1,2]])                                        and(v[o2,1]<>v[o1,1])and(v[o2,1]<>v[o1,2])                                        and(v[o1,2] in [v[o2,1]..v[o2,2]])                                        and(v[o1,2]<>v[o2,1])and(v[o1,2]<>v[o2,2]) then                                        begin                                                inc(ans);                                        end;                                end;                        end;                        if ans>2 then                        begin                                p:=false;                                r[b]:='non';                                break;                        end;                end;                if p=true then r[b]:='sane';        end;        writ;        //close(input);end.

0 0
原创粉丝点击