NOIP前夜的模板

 

神奇网站 —————— 2

~持续更新中~

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;
Dinic 最大流

 

 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;
spfa费用流

 

 

对拍

: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";
}
View Code

 

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);
    }
}
tarjan求SCC

次短路模板

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;
}
P1932

 

posted @ 2018-08-26 21:57  清风我已逝  阅读(254)  评论(0编辑  收藏  举报