PTIT121G spoj PTIT – Quan hệ

Nguồn đề bài: http://www.spoj.com/PTIT/problems/PTIT121G/

1. Đề bài PTIT121G spoj

Có N người mang tên tương ứng là 1, 2, …, N và tình trạng quen biết của N người này được cho bởi mảng đối xứng A[1..N][1..N] trong đó A[i][j] = A[j][i] = 1 nếu i quen j và bằng 0 nếu i không quen j (quy ước A[i,i]=0). Hãy xét xem liệu có thể chia N người đó thành 2 nhóm mà trong mỗi nhóm hai người bất kì đều không quen nhau?

Input

Gồm nhiều bộ test, mỗi bộ test có dạng như sau:

–          Dòng thứ nhất: Ghi số nguyên dương 1<=N <= 100

–          N dòng tiếp theo, dòng thứ i ghi N số A[i][1], …, A[i][N].

Bộ test kết thúc bởi dòng chứa số N=0.

Output

Với mỗi bộ test, in ra trên một dòng:

–          ‘YES’ nếu có thể chia.

–          ‘NO’ nếu không thể chia.

Example

INPUTOUTPUT
11

0 1 0 0 1 1 0 0 0 0 0

1 0 1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0 0

0 0 0 0 1 1 0 0 1 0 0

1 0 0 1 0 0 0 0 0 0 0

1 0 0 1 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0 0 1 0

0 0 0 0 0 0 0 0 1 1 0

0 0 0 1 0 0 0 1 0 0 0

0 0 0 0 0 0 1 1 0 0 1

0 0 0 0 0 0 0 0 0 1 0

0

YES

2. Hướng dẫn PTIT121G spoj PTIT – Quan hệ

Xây dựng mảng DD[1..N] như sau:

  • Khởi tạo mọi giá trị bằng 0.
  • Bắt đầu chia nhóm từ người thứ nhất cho tới người thứ N. Khi xét người thứ i, những khả năng sau có thể xảy ra:

+ Nếu DD[i] = 0 (chưa được xếp nhóm) thì xếp vào nhóm 1(DD[i] = 1) và xếp những người j quen i vào nhóm 2 (cho DD[j] =2).

+ Nếu DD[i] =  1 và trong số những người quen i có một người j mà DD[j] cũng bằng 1 thì kết luận không xếp được.

+Nếu DD[i] = 2 và trong số những người quen i có một người j mà DD[j] cũng bằng 2 thì kết luận không xếp được.

3. Code tham khảo PTIT121G spoj PTIT – Quan hệ

const   fi='';
        fo='';
        nmax=100+1;
type    data=longint;
var
        f,f1:text;
        n:data;
        A:array[1..nmax,1..nmax] of byte;
        DD:array[1..nmax] of byte;

procedure xuli;
var     i,j,k,tmp:data;
begin
        fillchar(dd,sizeof(dd),0);
        for i:=1 to n-1 do
                for j:=i+1 to n do
                        if a[i,j]=1 then
                                begin
                                        if (dd[i]=0) and (dd[j]=0) then
                                                begin
                                                        dd[i]:=1;
                                                        dd[j]:=2;
                                                        continue;
                                                end;

                                        if dd[i]<>0 then
                                             begin
                                                if dd[i]=1 then
                                                        tmp:=2
                                                else
                                                        tmp:=1;

                                                if dd[j]=0 then
                                                        begin
                                                                dd[j]:=tmp;
                                                        end
                                                else
                                                        if dd[j]=dd[i] then
                                                                begin
                                                                        writeln(f,'NO');
                                                                        exit;
                                                                end;
                                             end
                                        else
                                                begin
                                                        if dd[j]=1 then
                                                                tmp:=2
                                                        else
                                                                tmp:=1;
                                                        dd[i]:=tmp
                                                end;
                                end;
               writeln(f,'YES');
end;


procedure docfile;
var     i,j,tmp:data;
begin
        assign(f1,fi); reset(f1);
        assign(f,fo); rewrite(f);
        readln(f1,tmp);
        repeat
        if tmp=0 then break;
        n:=tmp;
        for i:=1 to n do
                begin
                        for j:=1 to n do
                                read(f1,a[i,j]);
                        readln(f1);
                end;
        xuli;
        readln(f1,tmp);
        until tmp=0;
        close(f1);
        close(f);
end;

begin
        docfile;
end.

One thought on “PTIT121G spoj PTIT – Quan hệ

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *