Luogu P1001 A+B Problem

 先来份正解

1 int main(){
2      int a,b;
3      scanf("%d%d",&a,&b);
4      printf("%d",a+b);
5      return 0;  
6 }
001

 恶搞开始

Dijkstra

struct Node{
    int v,to,next;
}e[maxn];
int tot,n,m;
int head[maxn],dis[maxn];
bool vis[maxn];
priority_queue<pair<int,int> >q;
inline void add(int x,int y,int z){
    e[++tot].v=y; e[tot].to=z;
    e[tot].next=head[x]; head[x]=tot;
}
inline void dijkstra(int s){
    memset(dis,127,sizeof dis);
    dis[s]=0;
    q.push(make_pair(0,s));
    while(q.size()){
        int x=q.top().second; q.pop();
        if(vis[x]) continue;
        vis[x]=true;
        for(int i=head[x];i;i=e[i].next){
            int y=e[i].v,z=e[i].to;
            if(dis[y]>dis[x]+z){
                dis[y]=dis[x]+z;
                q.push(make_pair(-dis[y],y));
            }
        }
    }
}
int main(){
     int a=read(),b=read();
     add(1,2,a); add(2,3,b);
     dijkstra(1);
     printf("%d",dis[3]);
     return 0;
}
Dijkstra

Spfa

struct Node{
    int v,to,next;
}e[maxn];
int tot,n,m;
int head[maxn],dis[maxn];
bool vis[maxn];
priority_queue<pair<int,int> >q;
inline void add(int x,int y,int z){
    e[++tot].v=y; e[tot].to=z;
    e[tot].next=head[x]; head[x]=tot;
}
inline void spfa(int s){
    queue<int> q;
    memset(dis,127,sizeof dis);
    dis[s]=0; vis[s]=true;
    q.push(s);
    while(q.size()){
        int x=q.front(); q.pop();
        vis[x]=false;
        for(int i=head[x];i;i=e[i].next){
            int y=e[i].v,z=e[i].to;
            if(dis[y]>dis[x]+z){
                dis[y]=dis[x]+z;
                if(!vis[y]) q.push(y),vis[y]=true;
            }
        }
    }
}
int main(){
     int a=read(),b=read();
     add(1,2,a); add(2,3,b);
     spfa(1);
     return 0;
}
Spfa

Floyd

int n,m;
inline void Floyd(){
    int dis1[5][5];
    for(int i=1;i<=3;i++)
    for(int j=1;j<=3;j++)
    dis1[i][j]=inf;
    dis1[1][2]=n; dis1[2][3]=m;
    for(int k=1;k<=3;k++)
    for(int i=1;i<=3;i++)
    for(int j=1;j<=3;j++)
    dis1[i][j]=min(dis1[i][j],dis1[i][k]+dis1[k][j]);
}
int main(){
      n=read(); m=read();
      Floyd();
      printf("%d",dis1[1][3]);
      return 0;
}
Floyd

前缀和、后缀和

inline void sumq(){
    int f[5]={};
    for(int i=1;i<=2;i+=){
        int x=read();
        f[i]=f[i-1]+x;
    }
    printf("%d",f[2]);
}
inline void sumh(){
    int f[5]={};
    for(int i=2;i>=1;i--){
        int x=read();
        f[i]=f[i+1]+x; 
    }
    printf("%d",f[1]);
}
int main(){
     //sumq();
     //sumh();
     return 0;
}
前缀和、后缀和

最小生成树

并查集

struct Node{
    int x,y,t;
    inline bool operator<(const Node&x)const{return t<x.t;}
}a[10];
int fa[11],ans,k;
inline int find(int x){
    if(x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}
inline void bingchaji(){
    for(int i=1;i<=10;i++) fa[i]=i;
    for(int i=1;i<=2;i++){
        a[i].t=read();
        a[i].x=i+1; a[i].y=1; k++;
    }
    a[++k].x=1; a[k].y=3; a[k].t=inf;
    sort(a+1,a+k+1);
    for(int i=1;i<=k;i++){
        int x=find(a[i].x),y=find(a[i].y);
        if(x!=y) fa[x]=y,ans+=a[i].t;
    }
    printf("%d",ans);
}
int main(){
    bingchaji();
    return 0;
}
最小生成树(并查集)

Prim

位运算

递归版

inline int weiyunsuan_dg(int a,int b){
     return b==0?a:weiyunsuan_dg(a^b,(a&b)<<1);
}
int main(){
     int a=read(),b=read(); 
     cout<<weiyunsuan_dg(a,b);
     return 0;
}
递归版

非递归版

inline void weiyunsuan_fdg(){
    int a=read(),b=read(),x=a&b,y=a^b;
    while(x){
        int s=y;
        int t=x<<1;
        x=s&t;
        y=s^t;
    }
    printf("%d",y);
}
int main(){
    weiyunsuan_fdg();
    return 0;
}
非递归

快读、快输版

inline int read(){
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-48;ch=getchar();}
    return x*f;
}
inline void put(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) put(x/10);
    putchar(x%10+48); 
    return;
}
int main(){
    put(read()+read());
    return 0; 
}
快读、快输版

 树状数组

int c[5];
inline int ask(int x){
    int ans=0;
    for(;x;x-=x&(-x)) ans+=c[x];
    return ans;
}
inline void add(int x,int y){
    while(x<=2){
        c[x]+=y;
        x+=x&(-x);
    }
}
int main(){
    for(int i=1;i<=2;i++)
        add(i,read());
    int ans=ask(2);
    printf("%d",ans);
    return 0; 
}
树状数组

 LCA

struct Node{
    int v,to,next;
}e[10];
int fa[10][5];
int head[10],deep[10],tot;
bool vis[10];
inline void add(int x,int y,int z){
    e[++tot].v=y; e[tot].to=z;
    e[tot].next=head[x]; head[x]=tot;
}
inline void bfs(){
    queue<int> q;
    deep[1]=1; q.push(1);
    vis[1]=true;
    while(q.size()){
        int x=q.front(); q.pop();
        for(int i=head[x];i;i=e[i].next){
            int y=e[i].v,z=e[i].to;
            if(!vis[y]){
                deep[y]=deep[x]+z;
                fa[y][0]=x;
                for(int j=1;j<10;j++) 
                    fa[y][j]=fa[fa[y][j-1]][j-1];
                vis[y]=true; q.push(y);
            }
        }
    }
}
inline int Lca(int x,int y){
    if(deep[x]<deep[y]) x^=y^=x^=y;
    for(int i=10;i>=0;i--)
        if(deep[fa[x][i]]>=deep[y])
            x=fa[x][i];
    if(x==y) return x;
    for(int i=10;i>=0;i--)
    if(fa[x][i]!=fa[y][i])
        x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
inline int dis(int x,int y){
    return deep[x]+deep[y]-2*deep[Lca(x,y)];
}
int main(){
    add(1,2,read()); add(2,3,read());
    bfs();
    printf("%d",dis(1,3));
    return 0;
}
LCA

DP

好像和前缀和一样

 

posted @ 2019-09-12 17:02  云山乱  阅读(158)  评论(0编辑  收藏  举报