开学后第一次用 Windows 打代码,有种唐氏儿的美。
Tarjan
tarjan 求强连通
不知道有没有过编,但大概没错。
Miku's Code
#include<bits;/stdc++.h>
#define rg register int
#define il inline
il int Min(int x,int y){ return x<y?x:y; }
il int Max(int x,int y){ return x<y?y:x; }
il int Abs(int x,int y){ return x<0?-x:x; }
il int read(){
char c=getchar();int f=1,x=0;
while(c<48){ if(c=='-')f=-1;c=getchar(); }
while(c>47){ x=(x<<3)+(x<<1)+(c^48);c=getchar(); }
return x*f;
}
int n,m,a[maxn];
int dfn[maxn],
int head[maxn<<1],t;
struct Edge{ int v,w;int next; };Edge e[maxn<<1];
il void add_edge(int u,int v,int w){ e[++t].v=v;e[t].w=w;e[t].next=head[u];head[u]=t; }
void tarjan(int now){
dfn[now]=low[now]=++cnt;
for(rg i=head[now];i;i=e[i].next){
int to=e[i].v;
if(!dfn[to]){
tarjan(to);
low[now]=Min(low[now],low[to]);
}
else if(vis[to]) low[now]=Min(low[now],dfn[to]);
}
if(dfn[now]==low[now]){
int cur;++id;
do{
cur=stk[top--];vis[cur]=false;
scc[cur]=id;++siz[id];
}while(cur!=now);
}
}
il void input(){
n=read(),m=read();int u,v,w;
for(rg i=1;i<=n;++i) a[i]=read();
for(rg i=1;i<=m;++i) u=read(),v=read(),w=read(),add_edge(u,v,w);
}
int main(){
input();
for(rg i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
return 0;
}
tarjan 求环
写了一个最小环版本的,过了。
Miku's Code
#include<bits/stdc++.h>
#define rg register int
#define il inline
#define cerr std::cerr
#define endl '\n'
il int Max(int x,int y){ return x<y?y:x; }
il int Min(int x,int y){ return x<y?x:y; }
il int Abs(int x){ return x<0?-x:x; }
il int read(){
char c=getchar();int x=0,f=1;
while(c<48){ if(c=='-')f=-1;c=getchar(); }
while(c>47){ x=(x<<3)+(x<<1)+(c^48);c=getchar(); }
return x*f;
}const int maxn=2e5+5,inf=0x3f3f3f3f;
int n,m,minn,id,a[maxn],dfn[maxn],low[maxn],tot,stk[maxn],top;
bool invis[maxn];
int head[maxn<<1],t;
struct Edge{ int v;int next; };Edge e[maxn<<1];
il void add_edge(int u,int v){ e[++t].v=v;e[t].next=head[u];head[u]=t; }
void tarjan(int now){
dfn[now]=low[now]=++tot;
stk[++top]=now;invis[now]=true;
for(rg i=head[now];i;i=e[i].next){
int to=e[i].v;
if(!dfn[to]){
tarjan(to);
low[now]=Min(low[now],low[to]);
}
else if(invis[to]) low[now]=Min(low[now],dfn[to]);
}
if(dfn[now]==low[now]){
int cur=stk[top],count_=0;
while(cur!=now){
++count_;invis[cur]=false;
--top;cur=stk[top];
}
++count_;
invis[cur]=false;--top;
if(count_>1) minn=Min(minn,count_);
}
}
il void input(){
n=read();int v;
for(rg i=1;i<=n;++i) v=read(),add_edge(i,v);
}
int main(){
// freopen("tarjan.in","r",stdin);
input();minn=inf;
for(rg i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
printf("%d\n",minn);
return 0;
}
ST 表
应该没错,好像如果要检查的话还要
标签:register,int,康复,练习,板子,rg,cerr,il,define From: https://www.cnblogs.com/sonnety-v0cali0d-kksk/p/fromal_exercise.html