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; } }
找出这个错误。
就只剩下费大和费小。