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

找出这个错误。

就只剩下费大和费小。