犯的错误有点多
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