zoukankan      html  css  js  c++  java
  • conscription(poj,3723)

    1,这些题目吧。。。

    2,核心反正转换成什么

    求解无向图中的最大权森林问题。

    3,首先得了解最小生成树的算法

    4,现在的学习曲线陡峭是因为什么?

    关键是代码不全。

    解决方法是从网上荡正确的代码。

    有的代码细节看不懂。

    5,其实代码细节就这一个不懂而已

    bool comp(const edge& e1,const edge& e2)
    {
    return e1.cost<e2.cost;
    }

    在函数的参数中使用const,可以让编译器知道在函数调用过程中,对于某个参数不会修改数据,从而可以提供给编译器更多的优化机会。

    比如标准函数

    char *strcpy(char *dst, const char *src);

    这里,第二个输入参数使用const char *src,而不是char *src. 这个表示函数strcpy不会修改 src指向的内容。

    6,图为啥跟并查集在一块搞呢。

    一个错误的代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int fa[1005],rank[1005];
    int n,m,r;
    void init(int p){
        for(int i=0;i<n;i++){fa[i]=i;//不对我这个初始化还跟题目有关的
        }
        fill(rank,rank+n,0);
        //height是干啥用的 
        //跟之前是一个东西 
    }
    int find(int x){
        if(fa[x]==x) return x;
        else return fa[x]=find(fa[x]);
    }
    void unite(int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x==y) return ;
        
        if(rank[x]<rank[y]) fa[x]=y;
        else{fa[y]=x;
            if(rank[x]==rank[y]) rank[x]++;
        }
        
    }
    bool same(int x,int y) 
    {
    return find(x)==find(y);}
    struct edge{
        int u,v,cost;
    }; 
    bool comp(const edge& e1,const edge& e2)
    {
        return e1.cost<e2.cost;
    }
    edge es[1005];
    //这个东西不知道干啥的
    int  kruskal()
    {
        sort(es,es+r,comp);
        init(n+m); 
        //不过n和m又是什么?就是男女兵数,就是
        //节点数 
        int res=0;
        for(int i=0;i<r;i++)
        {
            edge e=es[i];
            if(!same(e.u,e.v))
            {
                unite(e.u,e.v);
                res+=e.cost;
            }
        }
        return res;
     } 
    int main(){
        int loop;
        cin>>loop;
        int u,v,cost;
        for(int i=0;i<loop;i++)
        {
            cin>>n>>m>>r;
            for(int j=0;j<r;j++)
            {
            cin>>u>>v>>cost;
            es[j].cost=-cost;
            es[j].u=u;
            es[j].v=v+n;
        }
        }
        int ans=(n+m)*10000+kruskal();
        cout<<ans<<endl;
        
    } 

    在第一遍正确的问题上,我觉得我可能错了一些。

    7,这个是正确的第一遍的代码

    不急,慢慢来,总有手段把这个东西搞清。

    #include<iostream>
    #include<algorithm>
    #define MAX 10000
    using namespace std;
    
    int fa[MAX*2];
    int rank[MAX*2];
    int n,m,r;
    
    void init(int p){
        for(int i=0;i<p;i++){fa[i]=i;rank[i]=0;//不对我这个初始化还跟题目有关的
        }
    }
    int find(int x){
        if(fa[x]==x) return x;
        else return fa[x]=find(fa[x]);
    }
    void unite(int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x==y) return ;
        
        if(rank[x]<rank[y]) fa[x]=y;
        else{fa[y]=x;
            if(rank[x]==rank[y]) rank[x]++;
        }
        
    }
    bool same(int x,int y) 
    {
    return find(x)==find(y);}
    
    struct edge{
        int u,v,cost; 
    };
    bool comp(const edge& e1,const edge& e2)
    {
        return e1.cost<e2.cost;
    }
    edge es[MAX*5];
    
    int kruskal()
    {
        sort(es,es+r,comp);
        init(n+m);
        int res=0;
        for(int i=0;i<r;i++)
        {
            edge e=es[i];
            if(!same(e.u,e.v))
            {
                unite(e.u,e.v);
                res +=e.cost;
            }
        }
        return res;
    }
    int main(){
        int loop;
        cin>>loop;
        int u,v,cost;
        for(int i=0;i<loop;i++)
        {
            cin>>n>>m>>r;
            for(int j=0;j<r;j++)
            {
                cin>>u>>v>>cost;
                es[j].cost=-cost;
                es[j].u=u;
                es[j].v=v+n;
            }
            int ans=(n+m)*MAX+kruskal();
            cout<<ans<<endl;
        }
    }

    8,

    我的kruskal的模板

    struct edge
    {
        int u,v,cost;
    };
    bool comp(const edge& e1,const edge& e2)
    {
        return e1.cost<e2.cost;
    }
    edge es[max];
    int kruskal()
    {
        sort(es,es+r,comp);
        init(n+m);
        int res=0;
        for(int i=0;i<r;i++)
        {
            edge e=es[i];
            if(!same(e.v,e.u))
            {
                unite(e.v,e.u);
                res+=e.cost;
            }
        }
        return res;
    }

    我再网上看个教程深入理解下,

    9,

    这个的错误你以后再找

    #include<iostream>
    #include<algorithm>
    #define max 10000
    using namespace std;
    int fa[max],rank[max];
    int n,m,r;
    void init(int n){
        for(int i=0;i<n;i++){fa[i]=i;rank[i]=0;//不对我这个初始化还跟题目有关的
        }
    }
    int find(int x){
        if(fa[x]==x) return x;
        else return fa[x]=find(fa[x]);
    }
    void unite(int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x==y) return ;
        
        if(rank[x]<rank[y]) fa[x]=y;
        else{fa[y]=x;
            if(rank[x]==rank[y]) rank[x]++;
        }
        
    }
    bool same(int x,int y) 
    {
    return find(x)==find(y);}
    
    struct edge{
        int u,v,cost;
    };
    edge es[max];
    bool comp(const edge& e1,const edge& e2)
    {
        return e1.cost<e2.cost;
    }
    
    int kruskal()
    {
        sort(es,es+r,comp);
        init(n+m);
        int res=0;
        for(int i=0;i<r;i++)
        {
            edge e=es[i];
            if(!same(e.v,e.u))
            {
                unite(e.v,e.u);
                res+=e.cost;
            }
        }
        return res;
    }
    int main(){
        int loop;
        cin>>loop;
        for(int i=0;i<loop;i++)
        {
            cin>>n>>m>>r;
            for(int j=0;j<r;j++)
            {
                int u,v,cost;
                cin>>u>>v>>cost;
                es[i].u=u;
                es[i].v=v+n;
                es[i].cost=-cost;
            }
            cout<<"测试1"<<kruskal()<<endl;
            int ans=(n+m)*max+kruskal();
            cout<<ans<<endl;
        }
    }

    找出这个错误。

    就只剩下费大和费小。

  • 相关阅读:
    人生之清单(list of life)
    grpc编译错误解决
    windows tensorflow 版本与升级
    PermissionError: [Errno 13] in python
    经典分析--HTTP协议
    介绍 JSON
    Json 不同语言的使用
    JSON标准格式
    JSON 数据格式
    SKINTOOL 系统不能正常运行
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12216814.html
Copyright © 2011-2022 走看看