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
| INPUT | OUTPUT |
| 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.
hay lắm