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