BCACM11E spoj PTIT – Phương án bắn pháo

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.

 

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 *