Hướng dẫn giải của Động đất


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 happyboy99x

#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

#define TR(v,it) for(typeof((v).begin())it=(v).begin();it!=(v).end();++it)
vector<vector<int> > g;
int n, m, p;
bool vst[30000];

int main() {
    scanf("%d%d%d",&n,&m,&p);
    g.resize(n);
    for(int i = 0; i < m; ++i) {
        int u, v; scanf("%d%d",&u,&v);
        g[--u].push_back(--v);
        g[v].push_back(u);
    }
    for(int i = 0; i < p; ++i) {
        int u; scanf("%d", &u);
        vst[--u] = 1;
        TR(g[u], it) {
            vst[*it] = 1;
        }
    }
    queue<int> qu; qu.push(0); int res = n; vst[0] = 1;
    while(!qu.empty()) {
        --res; int u = qu.front(); qu.pop();
        TR(g[u], it) if(!vst[*it]) {
            vst[*it] = 1;
            qu.push(*it);
        }
    }
    printf("%d\n", res);
    return 0;
}

Code mẫu của ladpro98

#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <climits>
#include <cstdlib>
#include <ctime>
#include <memory.h>
#include <cassert>
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define REP(i, a, b) for(int i = (a); i <=(b); i++)
#define FORD(i, a, b) for(int i = (a); i > (b); i--)
#define REPD(i, a, b) for(int i = (a); i >=(b); i--)
#define TR(it, a) for(typeof((a).begin()) it = (a).begin(); it != (a).end(); ++it)
#define RESET(a, v) memset((a), (v), sizeof((a)))
#define SZ(a) (int((a).size()))
#define ALL(a) (a).begin(), (a).end()
#define PB push_back
#define MP make_pair
#define LL long long
#define LD long double
#define II pair<int, int>
#define X first
#define Y second
#define VI vector<int>
const int N = 30006;
using namespace std;
int n, m, q, ans;
VI a[N];
bool damaged[N], was[N];

void dfs(int u) {
    ans -= (was[u] = 1);
    TR(v, a[u])
    if (!damaged[*v] && !was[*v])
        dfs(*v);
}

int main() {
    ios :: sync_with_stdio(0); cin.tie(0);
    cin >> n >> m >> q;
    int u, v;
    FOR(i, 0, m) {
        cin >> u >> v;
        a[u].PB(v); a[v].PB(u);
    }
    while (q--) {
        cin >> u;
        TR(v, a[u]) damaged[*v] = 1;
    }
    ans = n;
    dfs(1);
    cout << ans;
    return 0;
}

Code mẫu của RR

{
PROG: damage
LANG: PASCAL
ID: invinci3
}
const
  FINP='';
  FOUT='';
  MAXN=30001;
type
  list=^node;
  node=record
         u:longint;
         next:list;
       end;
var
  f1,f2:text;
  q,n:longint;
  xet,c,dd:array[1..MAXN] of longint;
  ke:array[1..MAXN] of list;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure add(u:longint; var a:list);
var
  p:list;
begin
  new(p); p^.u:=u;
  p^.next:=a; a:=p;
end;
procedure inp;
var
  i,u,v,m:longint;
begin
  read(f1,n,m,q);
  for i:=1 to m do
    begin
      read(f1,u,v);
      add(u,ke[v]);
      add(v,ke[u]);
    end;
  for i:=1 to q do
    begin
      read(f1,u);
      dd[u]:=-1;
    end;
end;
procedure dfs(u:longint);
var
  v:longint;
  p:list;
begin
  c[u]:=1;
  p:=ke[u]; xet[u]:=1;
  while p<>nil do
    begin
      v:=p^.u; p:=p^.next;
      if xet[v]=1 then continue;
      if dd[v]=0 then dfs(v);
    end;
end;
procedure solve;
var
  v,u:longint;
  p:list;
begin
  for u:=1 to n do
  if dd[u]=-1 then
    begin
      p:=ke[u];
      while p<>nil do
        begin
          v:=p^.u; p:=p^.next;
          if dd[v]=0 then dd[v]:=1;
        end;
    end;
  if dd[1]=0 then dfs(1);
end;
procedure ans;
var
  i,count:longint;
begin
  count:=0;
  for i:=2 to n do inc(count,c[i]);
  writeln(f2,n-1-count);
end;
begin
  openF;
  inp;
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;

#define Rep(i,n) for(__typeof(n) i = 0; i < (n); ++i)
#define Repd(i,n) for(__typeof(n) i = (n)-1; i >= 0; --i)
#define For(i,a,b) for(__typeof(b) i = (a); i <= (b); ++i)
#define Ford(i,a,b) for(__typeof(a) i = (a); i >= (b); --i)
#define Fit(i,v) for(__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++i)
#define Fitd(i,v) for(__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++i)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define sz(a) ((int)(a).size())
#define all(a) (a).begin(), (a).end()
#define ms(a,x) memset(a, x, sizeof(a))
#define nl puts("")
#define sp printf(" ")
#define ok puts("ok")
//#include <conio.h>

template<class F, class T> T convert(F a, int p = -1) { stringstream ss; if (p >= 0) ss << fixed << setprecision(p); ss << a; T r; ss >> r; return r; }
template<class T> void db(T a, int p = -1) { if (p >= 0) cout << fixed << setprecision(p); cout << a << " "; }
template<class T> T gcd(T a, T b) { T r; while (b != 0) { r = a % b; a = b; b = r; } return a; }
template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
template<class T> T sqr(T x) { return x * x; }
template<class T> T cube(T x) { return x * x * x; }
template<class T> struct Triple { T x, y, z; Triple() {} Triple(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {} };
template<class T> Triple<T> euclid(T a, T b) { if (b == 0) return Triple<T>(1, 0, a); Triple<T> r = euclid(b, a % b); return Triple<T>(r.y, r.x - a / b * r.y, r.z); }
template<class T> int getbit(T s, int i) { return (s >> i) & 1; }
template<class T> T onbit(T s, int i) { return s | (T(1) << i); }
template<class T> T offbit(T s, int i) { return s & (~(T(1) << i)); }
template<class T> int cntbit(T s) { return s == 0 ? 0 : cntbit(s >> 1) + (s & 1); }
const int bfsz = 1 << 16; char bf[bfsz + 5]; int rsz = 0;int ptr = 0;
char gc() { if (rsz <= 0) { ptr = 0; rsz = fread(bf, 1, bfsz, stdin); if (rsz <= 0) return EOF; } --rsz; return bf[ptr++]; }
void ga(char &c) { c = EOF; while (!isalpha(c)) c = gc(); }
int gs(char s[]) { int l = 0; char c = gc(); while (isspace(c)) c = gc(); while (c != EOF && !isspace(c)) { s[l++] = c; c = gc(); } s[l] = '\0'; return l; }
template<class T> bool gi(T &v) {
    v = 0; char c = gc(); while (c != EOF && c != '-' && !isdigit(c)) c = gc(); if (c == EOF) return false; bool neg = c == '-'; if (neg) c = gc();
    while (isdigit(c)) { v = v * 10 + c - '0'; c = gc(); } if (neg) v = -v; return true;
}

const double PI = 2 * acos(0);
const string months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//const int dr[] = {0, 0, -1, +1};
//const int dc[] = {-1, +1, 0, 0};
const int dr[] = {-2, -1, +1, +2, +2, +1, -1, -2};
const int dc[] = {+1, +2, +2, +1, -1, -2, -2, -1};

const int inf = (int)1e9 + 5;
const ll linf = (ll)1e16 + 5;
const double eps = 1e-9;
const ll mod = 1000000000;
typedef pair<int, int> II;

using namespace std;

#define maxn 30005
#define maxe 200005

int n, m, p;
int adj[maxe], next[maxe], last[maxn], E = 0, a[maxn], que[maxn];
bool flag[maxn] = {0};

void add(int u, int v){
    adj[E] = v; next[E] = last[u]; last[u] = E++;
    adj[E] = u; next[E] = last[v]; last[v] = E++;
}

int go(){
    if(a[1]) return 0;
    flag[1] = 1;
    int size = 0; que[size++] = 1;
    int u, v;
    Rep(i, size){
        u = que[i];
        for(int e = last[u]; e != -1; e = next[e]){
            v = adj[e];
            if(!flag[v] && !a[v]){
                flag[v] = 1;
                que[size++] = v;
            }
        }
    }
    return size;

}

int main(){

//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    int u, v;
    gi(n); gi(m); gi(p);
    ms(last, -1); ms(a, 0);
    Rep(i, m){
        gi(u); gi(v); add(u, v);
    }

    Rep(i, p){
        gi(u);
        a[u] = 1;
        for(int e = last[u]; e != -1; e = next[e]){
            v = adj[e];
            a[v] = 1;
        }
    }
    printf("%d", n - go());
     // getch();
}

Code mẫu của ll931110

program DAMAGE;
const
  input  = '';
  output = '';
  maxn = 30000 + 40;
type
  pnode = ^tnode;
  tnode = record
    val: longint;
    link: pnode;
  end;
var
  fi,fo: text;
  n,m,q: longint;
  a: array[1..maxn] of pnode;
  free,path: array[1..maxn] of boolean;

procedure openfile;
begin
  assign(fi, input);  reset(fi);
  assign(fo, output);  rewrite(fo);
end;

procedure closefile;
begin
  close(fo);
  close(fi);
end;

procedure add(u,v: longint);
var
  p: pnode;
begin
  new(p);
  p^.val := v;
  p^.link := a[u];
  a[u] := p;
end;

procedure init;
var
  i,u,v: longint;
begin
  readln(fi, n, m, q);
  for i := 1 to m do
    begin
      readln(fi, u, v);
      add(u,v);  add(v,u);
    end;
end;

procedure DFS(u: longint);
var
  p: pnode;
begin
  path[u] := true;
  p := a[u];
  while p <> nil do
    begin
      if not path[p^.val] and free[p^.val] then DFS(p^.val);
      p := p^.link;
    end;
end;

procedure solve;
var
  i,x,cc: longint;
  p: pnode;
begin
  cc := 0;
  fillchar(path, sizeof(path), false);
  fillchar(free, sizeof(free), true);

  for i := 1 to q do
    begin
      readln(fi, x);
      if free[x] then free[x] := false;

      p := a[x];
      while p <> nil do
        begin
          if free[p^.val] then free[p^.val] := false;
          p := p^.link;
        end;
    end;

  DFS(1);
  for i := 1 to n do
    if not free[i] or not path[i] then inc(cc);
  writeln(fo, cc);
end;

begin
  openfile;
  init;
  solve;
  closefile;
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.