soituyet3s

Ngô Nhân

Đóng góp: 1

Ngày sinh: 25/01/1998

Đăng ký: 21/10/2015

Lần đăng nhập cuối: 20/01/2016


Kết nối tài khoản

VOJ: Chưa kết nối

Code cho ai cần :) Pascal (Nhìn dài dòng nhưng thực ra rất đơn giản)

const MAXV = 10000;
type p_node = ^node;

node = record
    vx: longint;
    next: p_node;
    end;
    
var list: array[1..MAXV] of p_node;
d, f: array[1..MAXV] of longint;
n, m, s: longint;

procedure add(u, v: longint);
    var p, q: p_node;
    begin
        p := list[u]; q := p;
        while (p <> nil) do
            begin
                if (p^.vx = v) then exit;
                q := p;
                p := p^.next;
            end;
        new(p); p^.vx := v;
        if (list[u] = nil) then list[u] := p
        else q^.next := p;
    end;
    
procedure enter;
    var fi: text;
    i, u, v: longint;
    begin
        assign(fi, ''); reset(fi);
        readln(fi, n, m, s);
        for i := 1 to m do
            begin
                readln(fi, u, v);
                add(u, v);
            end;
        close(fi);
    end;
    
procedure init;
    begin
        filldword(d, sizeof(d) div sizeof(d[1]), 0);
        d[s] := 1; f[s] := 1;
    end;
    
procedure BFS;
    type p_no = ^no;
    no = record
        vx: longint;
        next: p_no;
        end;
    var front, rear: p_no;
    u, v: longint;
    p1: p_node;
    procedure push(vx: longint);
        var p: p_no;
        begin
            new(p); p^.vx := vx;
            if (front = nil) then front := p
            else rear^.next := p;
            rear := p;
        end;
    function pop: longint;
        var p: p_no;
        begin
            pop := front^.vx;
            p := front;
            front := front^.next;
            dispose(p);
        end;
    begin
        front := nil;
        push(s);
        repeat
            u := pop;
            p1 := list[u];
            while (p1 <> nil) do
                begin
                    v := p1^.vx;
                    if (d[v] = 0) then
                        begin
                            d[v] := d[u] + 1;
                            f[v] := f[u];
                            push(v);
                        end
                    else if (f[v] < 2) and (d[v] - 1 = d[u]) then inc(f[v], f[u]);
                    p1 := p1^.next;
                end;
        until front = nil;
    end;
    
function count: longint;
    var i: longint;
    begin
        count := 0;
        for i := 1 to n do 
            if (f[i] > 1) then inc(count);
    end;
    
BEGIN
    enter;
    init;
    BFS;
    writeln(count);    
END.

Chuẩn bị cho kì thi học sinh giỏi quốc gia

Tình hình là mình khá bất ngờ khi qua được vòng 2 học sinh giỏi tỉnh, nên trước đó chưa chuẩn bị gì nhiều. Bây giờ chỉ còn hơn tháng nữa là đến kì thi mà mình chưa biết chuẩn bị như thể nào. Các bài trên http://vn.spoj.com/ thì nhiều quá mình không biết nên làm bài nào, mà đa phần là không làm được. Các thuật toán QHĐ, tham lam, đồ thị mình cũng còn chưa thuần thục cho lắm. Mong các anh chị khóa trước chia sẻ kinh nghiệm làm sao đạt kết quả tốt, nếu có thể hướng dẫn mình nên làm những bài nào trên vn.spoj thì càng tốt. Mình xin cảm ơn

Giúp đỡ bài toán bước nhảy châu chấu

Cho một lưới ô vuông hình chữ nhật kích thước R, C. Có một con châu chấu ở một ô bất kì. Con châu chấu có thể đi theo hình L trên lưới (tương tự con mã trong cờ tướng). Cho vị trí con châu chấu R1, C1 và vị trí là cây R2, C2. Tìm đường đi ngắn nhất để con châu chấu đến được lá cây.

Mình đã thử làm bằng đệ qui quay lui có nhánh cận, nhưng thời gian thực hiện quá lâu. Mình đang tìm hiểu lý thuyết đồ thị, mà khi quay lui thì phải gọi hàm try(i, j: integer) có hai tham số. Mình muốn biểu diễn bằng đồ thị ý. tức xem mỗi ô là một đỉnh nhưng không biết làm thế nào. Mong các bạn chỉ giáo.

Cần giúp n!!! mod m (triple factorial).

Như tiêu đề, đề yêu cầu tính n!!! mod m. Mình nghĩ là phải dùng QHĐ nhưng không biết lập công thức truy hồi. Các bạn giúp dùm