NOIP前夜的模板
~持续更新中~
Prim算法
int k=0; minn[n]=0; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(minn[j]<minn[k]&&!vis[j]) k=j; } vis[k]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&minn[j]>g[k][j]) minn[j]=g[k][j]; } k=0; }
Dinic最大流
struct Flow{ void init(){ tot=-1; memset(head,-1,sizeof(head)); memset(cur,-1,sizeof(cur)); } bool bfs(){ while(!Q.empty()) Q.pop(); memset(dep,0,sizeof(dep)); dep[S]=1;Q.push(S); while(!Q.empty()){ int u=Q.front();Q.pop(); for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(!dep[v]&&e[i].w>0){ dep[v]=dep[u]+1; Q.push(v); } } }return dep[T]; } int dfs(int u,int flow){ if(u==T) return flow; for(int &i=cur[u];i!=-1;i=e[i].next){ int v=e[i].to; if(dep[v]==dep[u]+1&&e[i].w>0){ int fl=dfs(v,min(e[i].w,flow)); if(fl>0){ e[i].w-=fl; e[i^1].w+=fl; return fl; } } }return 0; } void Dinic(){ ans=0; while(bfs()){ for(int i=0;i<=n+1;i++) cur[i]=head[i]; ans+=dfs(S,inf); } } void add(int u,int v,int w){ e[++tot].to=v,e[tot].next=head[u],head[u]=tot,e[tot].w=w; } void Add(int u,int v,int w){ add(u,v,w); add(v,u,0); } }netfl;
spfa费用流
struct MCMFF{ void init(){ tot=-1,cost=0; memset(head,-1,sizeof(head)); memset(e,0,sizeof(e)); } void add(int u,int v,int flow,int w){ e[++tot].to=v,e[tot].next=head[u],head[u]=tot,e[tot].w=w,e[tot].flow=flow; } void Add(int u,int v,int flow,int w){ add(u,v,flow,w); add(v,u,0,-w); } bool spfa() { memset(vis,0,sizeof(vis)); memset(dis,0x7f,sizeof(dis)); memset(flow,0x7f,sizeof(flow)); Q.push(S);vis[S]=1,pre[T]=-1,dis[S]=0; while(!Q.empty()){ int u=Q.front();Q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(e[i].flow>0&&dis[v]>dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; pre[v]=u,last[v]=i; flow[v]=min(flow[v],e[i].flow); if(!vis[v]){ Q.push(v); vis[v]=1; } } } }return pre[T]!=-1; } void MCMF(){ while(spfa()){ int u=T; cost+=flow[T]*dis[T]; while(u!=S){ e[last[u]].flow-=flow[T]; e[last[u]^1].flow+=flow[T]; u=pre[u]; } } } }netfl;
对拍
:loop maker.exe std.exe my.exe fc std.out my.out if %errorlevel%==0 goto loop pause
对拍2
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<windows.h> using namespace std; int main() { int T=1000; while(--T) { system("data.exe"); system("baoli.exe"); system("std.exe"); if(system("fc baoli.txt std.txt")) break; cout<<T; } if(!T)cout<<"no erorr"; else cout<<"erorr"; }
tarjan求强连通分量
int dfn[N],low[N],item,cnt,belong[N]; bool vis[N]; void tarjan(int u){ dfn[u]=low[u]=++item; vis[u]=1;S[++top]=u; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(!dfn[v]){ tarjan(v); low[u]=min(low[v],low[u]); }else if(vis[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]){ int v=u;++cnt; do{ v=S[top];top--; vis[v]=0;belong[v]=cnt,pw[cnt]+=w[v]; }while(v!=u); } }
次短路模板
struct node { int u,d; bool operator <(node x)const { return d>x.d; } }; priority_queue<node>Q; void spfa() { fill(dis,dis+n+1,inf); fill(dis2,dis2+n+1,inf); Q.push(node{1,0}); while(!Q.empty()) { node p=Q.top(); Q.pop(); int u=p.u,d=p.d; if(dis2[u]<d) continue; for(int i=head[u]; i; i=e[i].next) { int v=e[i].to,d2=d+e[i].w; if(dis[v]>d2) { swap(dis[v],d2); Q.push(node{v,dis[v]}); }if(dis2[v]>d2&&dis[v]<d2){ dis2[v]=d2; Q.push(node{v,dis2[v]}); } } } }
匈牙利算法——二分图匹配
bool dfs(int u,int t){ for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(dfn[v]!=t){ dfn[v]=t; if((!match[v])||dfs(match[v],t)){ //贪心思想,如果这个点还未匹配,就和他匹配,反之看一看和这个点已经匹配的点能否再找到一个点与之匹配,若能,就将这个点抢过来
match[v]=u;return true; } } } return false; }
高精度
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef int ll; struct node{ll a[20001],flag,size;}; inline node del(node t){ while(t.a[t.size]==0&&t.size>1)t.size--;return t; } inline node add(node t){ while(t.a[t.size+1]>0)t.size++; while(t.a[t.size]>9)t.a[t.size+1]+=t.a[t.size]/10,t.a[t.size++]%=10; return t; } inline node change(ll x){ node c;memset(c.a,0,sizeof(c.a)); if(x==0){c.size=c.flag=1;return c;}ll t=x; if(t<0)t*=-1,c.flag=-1;else c.flag=1;c.size=0; for(;t;t/=10)c.a[++c.size]=t%10;return c; } inline bool operator<(node y,node x){ if(x.flag!=y.flag)return y.flag==-1; if(y.flag==-1){ if(y.size!=x.size)return y.size>x.size; for(ll i=y.size;i>0;i--)if(y.a[i]!=x.a[i])return y.a[i]>x.a[i]; }else{ if(y.size!=x.size)return y.size<x.size; for(ll i=y.size;i>0;i--)if(y.a[i]!=x.a[i])return y.a[i]<x.a[i]; }return 0; } inline bool operator<=(node y,node x){ if(x.flag!=y.flag)return y.flag==-1; if(y.flag==-1){ if(y.size!=x.size)return y.size>x.size; for(ll i=y.size;i>0;i--)if(y.a[i]!=x.a[i])return y.a[i]>x.a[i]; }else{ if(y.size!=x.size)return y.size<x.size; for(ll i=y.size;i>0;i--)if(y.a[i]!=x.a[i])return y.a[i]<x.a[i]; }return 1; } inline bool operator>(node y,node x){ if(x.flag!=y.flag)return y.flag==1; if(y.flag==1){ if (y.size!=x.size)return y.size>x.size; for (ll i=y.size;i>0;i--)if (y.a[i]!=x.a[i])return y.a[i]>x.a[i]; }else{ if(y.size!=x.size)return y.size<x.size; for(ll i=y.size;i>0;i--)if(y.a[i]!=x.a[i])return y.a[i]<x.a[i]; }return 0; } inline bool operator>=(node y,node x){ if(x.flag!=y.flag)return y.flag==1; if(y.flag==1){ if(y.size!=x.size)return y.size>x.size; for(ll i=y.size;i>0;i--)if(y.a[i]!=x.a[i])return y.a[i]>x.a[i]; }else{ if(y.size!=x.size)return y.size<x.size; for(ll i=y.size;i>0;i--)if(y.a[i]!=x.a[i])return y.a[i]<x.a[i]; }return 1; } inline bool operator==(node y,node x){ if(x.flag!=y.flag)return 0; for(ll i=1;i<=y.size;i++)if(y.a[i]!=x.a[i])return 0; return 1; } inline bool operator!=(node y,node x){ if(x.flag!=y.flag)return 1; for(ll i=1;i<=y.size;i++)if(y.a[i]!=x.a[i])return 1; return 0; } inline node operator+(node y,node x){ node c;memset(c.a,0,sizeof(c.a));node t1=y,t2=x; if(y.flag!=x.flag){t1.flag=t2.flag=1; if(t1==t2)return c.flag=c.size=1,c; if(t1<t2)c.flag=x.flag,swap(t1,t2);else c.flag=y.flag; for(ll i=1;i<=t1.size;i++){ c.a[i]+=t1.a[i]-t2.a[i]; if(c.a[i]<0)c.a[i]+=10,c.a[i+1]--; }c.size=t1.size; }else{ if(y<x)swap(t1,t2);c.flag=y.flag; for(ll i=1;i<=t1.size;i++){ c.a[i]+=t1.a[i]+t2.a[i];c.a[i+1]=c.a[i]/10;c.a[i]%=10; }c.size=t1.size; }return del(add(c)); } inline node operator+(node y,ll x){ return y+change(x); } inline node operator-(node y,node x){ x.flag*=-1;return y+x; } inline node operator-(node y,ll x){ return y-change(x); } inline node operator*(node y,node x){ node c;memset(c.a,0,sizeof(c.a));c.flag=y.flag*x.flag; for(ll i=1;i<=y.size;i++)for(ll j=1;j<=x.size;j++){ c.a[i+j-1]+=y.a[i]*x.a[j];c.a[i+j]+=c.a[i+j-1]/10;c.a[i+j-1]%=10; }c.size=y.size+x.size-1;return del(add(c)); } inline node operator*(node y,ll x){ node t=y;if(x<0)x=-x,t.flag*=-1;for(ll i=1;i<=t.size;i++)t.a[i]*=x; for(ll i=1;i<=t.size;i++)t.a[i+1]+=t.a[i]/10,t.a[i]%=10;return del(add(t)); } inline node operator/(node y,node x){ node t,c;memset(t.a,0,sizeof(t.a));memset(c.a,0,sizeof(c.a)); c.flag=y.flag*x.flag;c.size=y.size;t.size=t.flag=x.flag=1; for(ll i=y.size;i>0;i--){ t.a[1]=y.a[i]; while(x<=t)t=t-x,c.a[i]++;t.size++; for(ll j=t.size;j>1;j--)t.a[j]=t.a[j-1]; }return del(c); } inline node operator/(node y,ll x){ ll k=0;if(x<0)x*=-1,y.flag*=-1; for(ll i=y.size;i>0;i--){ k=k*10+y.a[i];y.a[i]=k/x;k=k%x; }return del(y); } inline node operator%(node y,node x){ return y-y/x*x; } inline node operator%(node y,ll x){ return y-y/x*x; } inline node read(){ char s[10001];scanf("%s",s);node t; ll i=0;memset(t.a,0,sizeof(t.a));t.size=strlen(s); if(s[0]=='-')t.flag=-1,i=1;else t.flag=1; for(;i<t.size;i++)t.a[t.size-i]=s[i]-'0'; if(t.flag==-1)t.size--;t=del(t); if(t.size==1&&t.a[1]==0)t.flag=1;return t; } inline void write(const node& x){ if(x.flag==-1)putchar('-'); for(ll i=x.size;i>0;i--)putchar(x.a[i]+'0');puts(""); } node a,b; int main(){ a=read(),b=read(); write(a+b),write(a-b),write(a*b),write(a/b),write(a%b); return 0; }
博主蒟蒻,若有出错的地方,敬请指出。
如有侵犯您版权的地方,请快速联系我,我会撤回本博文。