Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCACM11E/
1. Đề bài BCACM11E spoj PTIT
Một hệ thống phòng thủ của địch gồm N điểm (N<=100), giữa các điểm bất kỳ của hệ thống đều có thể đi lại trực tiếp hoặc gián tiếp với nhau thông qua hệ thống các đường hầm. Bài toán được đặt ra là cho trước một hệ thống phòng thủ, hãy giúp bộ đội sử dụng đúng 1 quả pháo bắn vào một trong N điểm sao cho hệ thống bị chia cắt thành nhiều mảnh nhất.
Input: Dòng đầu tiên ghi số bộ test, không lớn hơn 100. Mỗi bộ test được tổ chức theo khuôn dạng sau:
- Dòng đầu tiên ghi lại số tự nhiên N không lớn hơn 100 là số điểm của hệ thống phòng thủ.
- Những dòng kế tiếp ghi lại ma trận G = (gij) biểu diễn hệ thống phòng thủ, trong đó gij=0 được hiểu là không có đường hầm trực tiếp nối giữa điểm i và j, gij =1 được hiểu có đường hầm nối trực tiếp giữa điểm i và điểm j (1<=i, j<=N).
Output: Với mỗi bộ test, in ra màn hình trên một dòng một số duy nhất là đỉnh bị phá hủy thỏa mãn yêu cầu bài toán (nếu có nhiều đỉnh cùng thỏa mãn yêu cầu thì in ra đỉnh có giá trị nhỏ nhất). Nếu không thể chia cắt được hệ thống, hãy in ra số 0.
Example
Input:
2
5
0 1 1 0 0
1 0 1 0 0
1 1 0 1 1
0 0 1 0 0
0 0 1 0 0
5
0 1 1 0 0
1 0 1 0 1
1 1 0 1 1
0 0 1 0 1
0 1 1 1 0
Output:
3
0
2. Hướng dẫn BCACM11E spoj PTIT
– Đưa bài toán về mô hình đồ thị sử dụng thuật toán “Khớp” đếm số thành phần liên thông khi bỏ đỉnh i nào đó khỏi đồ thị.
– Thực hiện duyệt tất cả các đỉnh 1->n, đồng thời lưu khớp có nhiều thành phần liên thông nhất.
3. code tham khảo BCACM11E spoj PTIT
const fi='';
nmax=100;
type data=longint;
matran=array[0..nmax+1,0..nmax+1] of byte;
var
f:text;
A,B:matran;
n,test:data;
dd:array[1..nmax] of boolean;
procedure init;
var i:data;
begin
for i:=1 to n do
dd[i]:=false;
end;
procedure dfs(i:data);
var j:data;
begin
dd[i]:=true;
for j:=1 to n do
if (not dd[j]) and (b[i,j]=1) then
dfs(j);
end;
function SPT:data;
var i,sl:data;
begin
sl:=0;
init;
for i:=1 to n do
if not dd[i] then
begin
inc(sl);
dfs(i);
end;
exit(sl);
end;
function khop(i:data):data;
var j,stplt:data;
begin
stplt:=spt;
for j:=1 to n do
begin
B[i,j]:=0;
B[j,i]:=0;
end;
khop:=spt;
if not (khop>stplt+1) then
khop:=0;
b:=a;
end;
procedure xuli;
var i,j,dinh,max,tmp:data;
begin
B:=A;
dinh:=1;
max:=khop(1);
for i:=2 to n do
begin
tmp:=khop(i);
if tmp>max then
begin
max:=tmp;
dinh:=i;
end;
end;
if max=0 then
writeln(0)
else
writeln(dinh);
end;
procedure docfile;
var i,j,x:data;
begin
assign(f,fi); reset(f);
readln(f,test);
for x:=1 to test do
begin
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do
read(f,a[i,j]);
readln(f);
end;
xuli;
end;
end;
begin
docfile;
end.