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.
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