Hướng dẫn giải của Biến đổi số


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 ladpro98

#include <iostream>
#include <stdio.h>
#include <cstdio>
#define maxn 10001

int adj[maxn], adj2[maxn], head[maxn], head2[maxn], linker[maxn], link2[maxn], part[maxn];
bool avail[maxn], visit[maxn];
int res,n,m,t,ssc;

using namespace std;

void inputer() {
    //freopen("number.in","r",stdin);
    scanf("%d %d %d", &n, &m, &t);
    int x,y;
    for(int i=1; i<=m; i++) {
        scanf("%d %d", &x, &y);
        adj[i] = y;
        linker[i] = head[x];
        head[x] = i;
        adj2[i] = x;
        link2[i] = head2[y];
        head2[y] = i;
    }
}

int dfser(int i) {
    avail[i] = false;
    int j = head[i];
    while (j) {
        if (avail[adj[j]]) return dfser(adj[j]);
        j = linker[j];
    }
    return i;
}

void dfs2(int i) {
    visit[i] = true;
    int j = head2[i];
    while (j) {
        if (!visit[adj2[j]])
            dfs2(adj2[j]);
        j = link2[j];
    }
}

void dfsFind(int i) {
    visit[i] = true;
    avail[part[i]] = false;
    int j = head2[i];
    while (j) {
        if (!visit[adj2[j]])
            dfsFind(adj2[j]);
        j = link2[j];
    }
}

void process() {
    for(int i=1; i<=n; i++)
    {
        avail[i] = true;
        visit[i] = false;
    }
    int st;
    for(int i=1; i<=n; i++) {
        if (!visit[i]) {
            st = dfser(i);
            ssc++;
            part[st] = ssc;
            dfs2(st);
        }
    }
    for(int i=1; i<=n; i++) {
            visit[i] = false;
            avail[i] = true;
    }
    dfsFind(t);
    for(int i=1; i<=ssc; i++)
        if (avail[i]) res++;
}

void outputer() {
    printf("%d",res);
}

int main()
{
    inputer();
    process();
    outputer();
    return 0;
}

Code mẫu của RR

//Written by RR

{$MODE OBJFPC}

uses math;
const
  FINP          =       '';
  FOUT          =       '';
  MAXN          =       10111;

type
  list          =       ^node;
  node          =       record
        u       :       longint;
        next    :       list;
  end;

procedure add(u:longint; var a:list);
    var
      p:list;
    begin
      new(p); p^.u:=u;
      p^.next:=a; a:=p;
    end;

var
  f1,f2         :       text;

  //Input
  m,n,t         :       longint;
  ke            :       array[1..MAXN] of list;

  vao,ra,dd     :       array[1..MAXN] of longint;
  hsize         :       longint;
  h,hpos        :       array[1..MAXN] of 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,u,v:longint;
    begin
      read(f1,n,m,t);
      for i:=1 to m do
        begin
          read(f1,u,v);
          if u=v then continue;
          add(u,ke[v]);
          inc(ra[v]);
          inc(vao[u]);
        end;
    end;

procedure swap(var a,b:longint);
    var
      tmp:longint;
    begin
      tmp:=a; a:=b; b:=tmp;
    end;

procedure swaph(var a,b:longint);
    begin
      swap(hpos[h[a]],hpos[h[b]]);
      swap(h[a],h[b]);
    end;

function lower(a,b:longint):boolean;
    begin
      exit( vao[h[a]] < vao[h[b]] );
    end;

procedure down(i:longint);
    var
      j:longint;
    begin
      j:=i shl 1;
      while (j<=hsize) do
        begin
          if (j<hsize) and lower(j+1,j) then inc(j);
          if lower(j,i) then swaph(i,j);
          i:=j; j:=i shl 1;
        end;
    end;

procedure up(i:longint);
    var
      j:longint;
    begin
      j:=i shr 1;
      while (i>1) and lower(i,j) do
        begin
          swaph(i,j);
          i:=j; j:=i shr 1;
        end;
    end;

procedure push(u:longint);
    begin
      inc(hsize); h[hsize]:=u; hpos[u]:=hsize;
      up(hsize);
    end;

procedure pop(var u:longint);
    begin
      u:=h[1]; hpos[u]:=0;
      h[1]:=h[hsize]; hpos[h[1]]:=1; dec(hsize);
      down(1);
    end;

procedure dfs(u:longint);
    var
      v:longint;
      p:list;
    begin
      dd[u]:=1;
      p:=ke[u];
      while p<>nil do
        begin
          v:=p^.u; p:=p^.next;
          if dd[v]=0 then dfs(v);
        end;
    end;

procedure solve;
    var
      i,u,v,res:longint;
      p:list;
    begin
      for i:=1 to n do
        push(i);

      res:=0;
      dfs(t);
      for i:=1 to n do
        begin
          pop(u);
          if (u<>t) and (dd[u]=0) then inc(res);
          dfs(u);
        end;
      writeln(f2,res);
    end;

begin
  openF;
  inp;
  solve;
  closeF;
end.

Code mẫu của hieult

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
//#include<conio.h>
#define ep 0.000000001
//#define maxn 222
#define oo 1111111111
#define base 100000000
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
double const PI=4*atan(1);
int const maxn = 10003;

using namespace std;

//NUMBER


struct CANH{
     int u,v;
};

    int a[maxn],n,m,t,u,v,KQ;
    CANH c[maxn];
    int coun[maxn],head[maxn];
    bool f[maxn];

void BFS(int u){
          int v;
          f[u] = false;
          for(int i=head[u];i<=head[u+1]-1;i++) {
                        v = a[i];
                        if(f[v]) BFS(v);
          }
}

int main(){   
//freopen("NUMBER.in","r",stdin);
scanf("%d %d %d",&n,&m,&t);

for(int i = 1;i<=m;i++){
        scanf("%d %d",&c[i].v,&c[i].u);
        coun[c[i].u]++;
}
f[1] = true;
head[1] = 1;
head[n+1] = m+1;
for(int i = 2;i<=n;i++){
         head[i] = head[i-1]+coun[i-1];
         f[i] = true;
}
for(int i = 1;i<=m;i++){
         u = c[i].u;
         v = c[i].v;
         coun[u]--;
         a[head[u]+coun[u]] = v;
}
BFS(t);
for(int i = 1;i<=n;i++)
    if(f[i]){
            BFS(i);
            f[i] =true;
}
for( int i  = 1;i<=n;i++)
    if (f[i]) KQ++;
printf("%d",KQ);
//getch();
}

Code mẫu của khuc_tuan

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

int n, m, T;
vector<int> ds[11000];
bool vs[11000], visiting[11000];
stack<int> st;
int low[11000], num[11000], dem = 0;
int tp[11000], sotp = 0;
bool mark[11000];

void dfs(int i) {
    visiting[i] = true;
    st.push(i);
    vs[i] = true;
    low[i] = num[i] = ++dem;
    for(int k=0;k<ds[i].size();++k) {
        int j = ds[i][k];
        if(!vs[j]) {
            dfs(j);
            low[i] <?= low[j];
        }   
        else if(visiting[j]) low[i] <?= num[j];
    }
    if(low[i] == num[i]) {
        ++ sotp;
        while(true) {
            int u = st.top();
            st.pop();
            tp[u] = sotp;
            if(u==i) break;
        }
    }
    visiting[i] = false;
}

int main() {
    scanf("%d%d%d", &n, &m, &T);    
    for(int i=0;i<m;++i) {
        int u, v;
        scanf("%d%d", &u, &v);
        ds[u].push_back(v); 
    }
    // cout << "??" << endl;
    for(int i=1;i<=n;++i) if(!vs[i]) dfs(i);
    for(int i=1;i<=n;++i) for(int k=0;k<ds[i].size();++k) {
        int j = ds[i][k];
        if(tp[i] != tp[j]) {
            mark[tp[i]] = true;
        }
    }
    int result = 0;
    for(int i=1;i<=sotp;++i) if(!mark[i] && i!=tp[T]) ++result;
    cout << result << endl;
    return 0;
}

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.