Hướng dẫn giải của Bộ ba cao thủ


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const maxn=1010;
var n,re,x,y,z:longint;
    a:array[1..maxn,0..maxn] of longint;
    d:array[1..maxn] of longint;

procedure rf;
var i,j,z,t:longint;
begin
     t:=0; z:=1;
     readln(n);
     for i:=1 to n do
         for j:=1 to n do
         begin
              read(a[i,j]);
              if (i>j) and (a[i,j]+a[j,i]<>1) then z:=z div t;
         end;
     for i:=1 to n do a[i,0]:=1;
end;

procedure pr;
var i,j,t:longint;
begin
     re:=0;
     d[1]:=1;
     for i:=2 to n do
     begin
          for j:=1 to i do
              if a[i,d[j]]=1 then break;
          for t:=j+1 to i-1 do
              if a[i,d[t]]=0 then
              begin
                   re:=1;
                   x:=i; y:=d[j]; z:=d[t];
                   exit;
              end;
          for t:=i downto j+1 do d[t]:=d[t-1];
          d[j]:=i;
     end;
end;

procedure wf;
begin
     if re=0 then writeln('-1 -1 -1')
     else writeln(x,' ',y,' ',z);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của ladpro98

program nktrio;
uses    math;
const   maxN=1001;
        fi='';
var     a:array[1..maxN,1..maxN] of longint;
        c:array[1..maxN] of longint;
        inStack:array[1..maxN] of boolean;
        n,i,count,res:longint;

procedure input;
var     inp:text;
        i,j:longint;
begin
        assign(inp,fi);
        reset(inp);
        readln(inp,n);
        for i:=1 to n do
        for j:=1 to n do
        read(inp,a[i,j]);
        close(inp);
end;

procedure output;
var     i,j:longint;
begin
        for i:=1 to n do
        for j:=1 to n do
        if (a[res,i]=1) and (a[i,j]=1) and (a[j,res]=1) then
        begin
                write(res,' ',i,' ',j);
                exit;
        end;
end;

procedure dfs(i:longint);
var     j:longint;
begin
        c[i]:=count;
        for j:=1 to n do
        if a[i,j]=1 then
        begin
                if inStack[j] then
                begin
                        res:=j;
                        output;
                        halt;
                end;
                if c[j]=0 then
                begin
                        inStack[j]:=true;
                        dfs(j);
                        inStack[j]:=false;
                end;
        end;
end;

begin
        input;
        count:=0;
        for i:=1 to n do
        if c[i]=0 then
        begin
                inc(count);
                inStack[i]:=true;
                dfs(i);
                instack[i]:=false;
        end;
        write(-1,' ',-1,' ',-1);

end.

Code mẫu của RR

//Written by RR
{$R+,Q+}
uses math;
const
  FINP          =       '';
  FOUT          =       '';
  MAXN          =       1111;
var
  f1,f2         :       text;
  father        :       array[1..MAXN] of longint;
  c             :       array[1..MAXN,1..MAXN] of longint;
  n             :       longint;

procedure openF;
    begin
      assign(f1,FINP); reset(f1);
      assign(f2,FOUT); rewrite(f2);
    end;
procedure closeF;
    begin
      close(f1);
      close(f2);
    end;
procedure inp;
    var
      i,j:longint;
    begin
      readln(f1,n);
      for i:=1 to n do
        begin
          for j:=1 to n do
            read(f1,c[i,j]);
          readln(f1);
        end;
    end;
procedure dfs(u:longint);
    var
      v:longint;
    begin
      for v:=1 to n do
      if c[u,v]=1 then
        if father[v]=0 then
          begin
            father[v]:=u;
            dfs(v);
          end
        else if (father[u]>0) and (c[v,father[u]]=1) then
          begin
            writeln(f2,u,' ',v,' ',father[u]);
            closeF;
            halt;
          end;
    end;

var
  i:longint;

begin
  openF;
  inp;
  for i:=1 to n do
    if father[i]=0 then
      begin
        father[i]:=-1;
        dfs(i);
      end;
  writeln(f2,'-1 -1 -1');
  closeF;
end.

Code mẫu của hieult

#include <iostream>
#include <cstdio>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cstring>
#include <string>
using namespace std;
#define REP(i,a,b) for(int i=a;i<=b;++i)
#define DOWN(i,a,b) for(int i=a;i>=b;--i)
#define EPS 1e-9

int s[2005][2005];
struct Point{
    int deg;
    int pos;
    bool operator<(const Point& that)const{
        return deg<that.deg;
    }
};

Point d[5005];
int main()

{
//  freopen("NKTRIO.IN", "rt", stdin);
    //freopen("NKTRIO.out","wt",stdout);
    int n;
    scanf("%d",&n);
    REP(i,0,n){
            d[i].pos=i;
            d[i].deg=0;
    }
    REP(i,0,n-1){
        REP(j,0,n-1){
            scanf("%d",&s[i][j]);
            if(s[i][j]){
                d[i].deg++;
            }
        }
    }
//  REP(i,0,n-1)
//  {
//      REP(j,0,n-1)
//      cout<<s[i][j]<<" ";
//      cout<<endl;
//  }
    sort(d,d+n);
    REP(i,0,n-2){
        if(d[i].deg==d[i+1].deg){
            int a=d[i].pos;
            int b=d[i+1].pos;
            DOWN(j,n-1,0){
                if(s[b][a]==1)
                {
                    if(s[a][j]==1 && s[j][b]==1)
                    {
                        cout<<a+1<<" "<<j+1<<" "<<b+1;
                        return 0;
                    }
                }
                else
                {
                    if(s[b][j]==1 && s[j][a]==1)
                    {
                        cout<<b+1<<" "<<j+1<<" "<<a+1;
                        return 0;
                    }
                }
            }
        }
    }
//  //Cach 2.
//  cout<<"\n Duyet theo cach trau"<<endl;
//  REP(i,0,n-1)
//  REP(j,0,n-1)
//  REP(t,0,n-1){
//      if(s[i][j]=='1' && s[j][t]=='1' && s[t][i]=='1'){
//          cout<<i+1<<" "<<j+1<<" "<<t+1<<endl;
//      }
//  }

    cout<<"-1 -1 -1";

    return 0;
}

Code mẫu của ll931110

program NKTRIO;
const
  input  = '';
  output = '';
  maxn = 1000;
var
  a: array[1..maxn,1..maxn] of integer;
  d: array[1..maxn] of integer;
  n: integer;

procedure init;
var
  f: text;
  i,j: integer;
begin
  assign(f, input);
    reset(f);

  readln(f, n);
  for i := 1 to n do
    for j := 1 to n do read(f, a[i,j]);

  close(f);
end;

procedure solve;
var
  f: text;
  i,j,k: integer;
begin
  assign(f, output);
    rewrite(f);

  fillchar(d, sizeof(d), 0);
  d[1] := 1;
  for i := 2 to n do
    begin
      j := 1;
      while (j < i) and (a[i,d[j]] = 0) do inc(j);
      if j = i then d[i] := i else
        begin
          for k := j + 1 to i - 1 do
            if a[i,d[k]] = 0 then
              begin
                writeln(f, i, ' ', d[j], ' ', d[k]);
                close(f);
                exit;
              end;

          for k := i downto j + 1 do d[k] := d[k - 1];
          d[j] := i;
        end;
    end;

  writeln(f, -1, ' ', -1, ' ', -1);
  close(f);
end;

begin
  init;
  solve;
end.

Code mẫu của skyvn97

#include<cassert>
#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#define MAX   1010
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;i=i+1)
#define REP(i,n) for (int i=0,_n=(n);i<_n;i=i+1)
using namespace std;
int win[MAX][MAX];
int low[MAX],num[MAX],compID[MAX],compSZ[MAX],vstID[MAX];
int n,cnt,nComp;
stack<int> st;
void loadgraph(void) {
    scanf("%d",&n);
    FOR(i,1,n) FOR(j,1,n) scanf("%d",&win[i][j]);
}
void dfs(int u) {
    low[u]=num[u]=++cnt;
    st.push(u);
    FOR(v,1,n) if (win[u][v] && compID[v]==0) {
        if (num[v]==0) {
            dfs(v);
            low[u]=min(low[u],low[v]);
        } else low[u]=min(low[u],num[v]);
    }
    if (low[u]==num[u]) {
        nComp++;
        int v;
        do {
            v=st.top();st.pop();
            compID[v]=nComp;
            compSZ[nComp]++;
        } while (v!=u);
    }
}
int getNext(int u) {
    FOR(v,1,n) if (win[u][v] && compID[u]==compID[v]) return (v);
}
vector<int> circle(int u) {
    memset(vstID,-1,sizeof vstID);
    vector<int> path;
    while (true) {
        if (vstID[u]>=0) return (vector<int>(path.begin()+vstID[u],path.end()));
        vstID[u]=path.size();
        path.push_back(u);
        u=getNext(u);
    }
}
void process(void) {
    FOR(i,1,n) if (num[i]==0) dfs(i);
    FOR(i,1,nComp) if (compSZ[i]>=3)
        FOR(s,1,n) if (compID[s]==i) {
            vector<int> cir=circle(s);
            FOR(j,2,(int)cir.size()-1) if (win[cir[j]][cir[0]]) {
                int u=cir[0];
                int v=cir[j-1];
                int w=cir[j];
                assert(win[u][v] && win[v][w] && win[w][u]);
                printf("%d %d %d\n",u,v,w);
                return;
            }
        }
    printf("-1 -1 -1\n");
}
int main(void) {
    loadgraph();
    process();
    return 0;
}

Code mẫu của khuc_tuan

// {$APPTYPE CONSOLE}
{$MODE DELPHI}

var
    n, i, j : integer;
    a : array[1..1000,1..1000] of integer;
    visiting, vs : array[1..1000] of boolean;
    b : array[1..1000] of integer;
    s : array[1..1000] of integer;
    ns : integer;

procedure getcycle(st, en : integer);
var
    i : integer;
begin
    i := en;
    while i <> st do
    begin
        inc(ns);
        s[ns] := i;
        i := b[i];
    end;
    inc(ns);
    s[ns] := i;
    for i:= 1 to ns do
    begin
        if a[s[i], s[i+2]]=1 then
        begin
            writeln(s[i], #32, s[i+2], #32, s[i+1]);
            halt;
        end;
        s[i+1] := s[i];
    end;
end;

procedure dfs(i : integer);
var
    j : integer;
begin
    vs[i] := true;
    visiting[i] := true;
    for j:=1 to n do
        if (a[i,j]=1) then
        begin
            if not vs[j] then
            begin
                b[j] := i;
                dfs(j);
            end
            else
            begin
                if visiting[j] then getcycle(j,i);
            end;
        end;
    visiting[i] := false;
end;

begin
    read(n);
    for i:=1 to n do
        for j:=1 to n do
            read(a[i,j]);
    for i:=1 to n do
        if not vs[i] then
            dfs(i);
    writeln('-1 -1 -1');
end.

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.