--求大佬查错--

P3366 【模板】最小生成树

犯的错误有点多 1.读入优化写错了,ch应赋初值为0 2.kruskal里if(x!=y)后面的分号什么鬼 3.读入边里面的那一堆vis判断ifelse什么的都删掉 4.快排写错了,为何不用stl
by Night_Aurora @ 2017-11-07 09:27:13


这是给你改后的代码 @[Rye\_Catcher](/space/show?uid=61382) ```cpp #include <stdio.h> #include <string.h> #include <algorithm> #define maxe 200001//edge #define maxn 5001//node int n,m,flag=0; int father[maxn]; int vis[maxn][maxn]; int totedge=0,totwgt=0; struct Edge { int to;int from;int distance; bool operator <(const Edge&i)const {return distance<i.distance; } } edge[maxe]; int read() { char c;int a;short int ch=0; while((c=getchar())<'0'||c>'9') ch=c=='-'; a=c-'0'; while((c=getchar())>='0'&&c<='9') a=a*10+c-48; return ch?-a:a; } int min(int x,int y) { if(x>y) return y; else return x; } void qs(int l,int r) { int i=l,j=r,mid=(l+r)/2,temp; while(i<=j) { while(edge[i].distance<edge[mid].distance) i++; while(edge[j].distance>edge[mid].distance) j--; if(i<=j) { //swap(&edge[i].distance,&edge[j].distance); //swap(&edge[i].to,&edge[j].to); //swap(&edge[i].from,&edge[j].from); temp=edge[i].distance;edge[i].distance=edge[j].distance;edge[j].distance=temp; temp=edge[i].to;edge[i].to=edge[j].to;edge[j].to=temp; temp=edge[i].from;edge[i].from=edge[j].from;edge[j].from=temp; i++;j--; } } if(i<r) qs(i,r); if(l<j) qs(l,j); } int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return father[x]; } void merge(int x,int y) { int f1=find(x); int f2=find(y); if(f1!=f2) father[f2]=f1; //father[y]=x; } int main() { int i,j; int x,y,z; //scanf("%d %d",&n,&m); n=read();m=read(); memset(vis,0,sizeof(vis)); for(i=1,j=1;j<=m;i++,j++) { edge[i].from=read(); edge[i].to=read(); edge[i].distance=read(); } m=i-1; // for(i=1;i<=m;i++) // { // printf("%d %d %d\n",edge[i].from,edge[i].to,edge[i].distance); // } std::sort(edge+1,edge+1+m); for(i=1;i<=n;i++) father[i]=i; // for(i=1;i<=m;i++) { x=find(edge[i].to);y=find(edge[i].from); if(x!=y) { merge(x,y); totwgt+=edge[i].distance; totedge++; if(totedge==n-1) {flag=1;break;} } } if(flag==1) printf("%d",totwgt); else printf("orz"); return 0; } ```
by Night_Aurora @ 2017-11-07 09:27:56


@ Rye\_Catcher 感觉你的读入很奇怪。实际上200000的数据scanf也是不会超的,并且你的读入在我的机子上是读不了接下去的数的,只能读入n和m(快读一般用不到,所以没把握不要写)。 程序粗心。你看你最后那边有一句 ```cpp if(x!=y);{ merge(x,y); totwgt+=edge[i].distance; totedge++; if(totedge==n-1) { flag=1; break; } } ``` 第一个if语句就有分号啊!!! 还有,totedge==n-1??不是应该==m-1吗。。。。 看起来你应该是个C选手,所以手写快排(我一般都直接用算法库的快排,algorithm,using namespace std即可sort) 对于Kruscal算法,实际上不需要一个vis数组来表示的,看了半天没看懂你那个读入的i,j是什么用的。 改完后(好像改得面目全非,实测已AC): ```cpp #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<map> #include<queue> #include<cstdlib> #define maxe 200003//edge #define maxn 5003//node using namespace std; int n,m,flag=0,father[maxn],totedge=0,totwgt=0,x,y; struct Edge{ int to; int from; int distance; }edge[maxe]; bool cmp(Edge xx,Edge yy){ return xx.distance<yy.distance; } int find(int x){ if(father[x]!=x) father[x]=find(father[x]); return father[x]; } void merge(int x,int y){ int f1=find(x); int f2=find(y); if(f1!=f2) father[f2]=f1; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].distance); m--; sort(edge+1,edge+m+1,cmp); for(int i=1;i<=n;i++) father[i]=i; // for(int i=1;i<=m;i++){ x=find(edge[i].to);y=find(edge[i].from); if(x!=y){ merge(x,y); totwgt+=edge[i].distance; totedge++; if(totedge==n-1) {flag=1;break;} } } if(flag==1) printf("%d",totwgt); else printf("orz"); return 0; } ``` 你可以把sort和cmp的那一部分当做你的qs。(C++福利不手写快读) 附赠一个快读模板(LL 表示long long): ```cpp inline LL read(){ LL base=0,flag=1; char ch='.'; while(ch>'9'||ch<'0'){ ch=getchar(); if(ch=='-') flag=-1; } while(ch>='0'&&ch<='9'){ base=base*10+ch-'0'; ch=getchar(); cout<<base<<endl; }; return flag*base; } ```
by Lyrics @ 2017-11-07 09:31:54


@[Night\_Aurora](/space/show?uid=25508) 没发现原来有人。。发表回复后才发现有人的回事。尴尬 ̄□ ̄||
by Lyrics @ 2017-11-07 09:32:53


@[Night\_Aurora](/space/show?uid=25508) 谢谢大佬指错,可是我真的看不出快排错在哪里,还有C语言也能用STL吗?(感觉教练让我们选C就是个错误)
by Rye_Catcher @ 2017-11-07 09:34:26


@[Rye\_Catcher](/space/show?uid=61382) 那就van蛋了 反正亲测快排不对就是了
by Night_Aurora @ 2017-11-07 09:35:15


@[Lyrics](/space/show?uid=28939) 太感谢了,查了半小时错还没有你细心,一开始我看数据中有重复的出现,于是用一个vis记录,现在想想确实是多虑了。
by Rye_Catcher @ 2017-11-07 09:37:43


@[Night\_Aurora](/space/show?uid=25508) dalao改了头像吓了我一跳
by 青衫白叙 @ 2017-11-07 10:04:30


@[Rye\_Catcher](/space/show?uid=61382) [C不行](https://zhidao.baidu.com/question/319276257.html),QAQ,那你手写快排吧。。
by Lyrics @ 2017-11-07 10:24:35


@[Lyrics](/space/show?uid=28939) 明明转C++就好了。。
by 青衫白叙 @ 2017-11-07 10:26:23


| 下一页