@[weee](/user/742221) 你照我注释改,没过再找我!```
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0,cnt=0;// cnt定义了2次 ,但问题不大
int fa[200000];//从1开始要定200001
struct rec {
int t1;
int t2;
int t3;
}edge[200000];//从1开始要定200001
bool operator <(rec a, rec b) {
return a.t3<b.t3;
}
int get(int x) {
if(x==fa[x]) return x;
return fa[x]=get(fa[x]);
}
int main() {
cin>>n>>m;
int cnt=0;//cnt定义了2次
for(int i=1;i<=m;i++) fa[i]=i;
for(int i=1;i<=m;i++) {
cnt++;
edge[i].t1=0;
edge[i].t2=i;
edge[i].t3=n;
}
int flage;
for(int i=1;i<=m;i++) {
for(int j=1;j<=m;j++) {
cin>>flage;
if(flage) {
cnt++;
edge[cnt].t1=i;//邻接矩阵遍历1边即可 ,这样也不错
edge[cnt].t2=j;
edge[cnt].t3=flage;
}
}
}
sort(edge+1,edge+cnt+1);
for(int i=1;i<=m;i++) {//i<=cnt
int x=get(edge[i].t1); int y=get(edge[i].t2);
if(x==y) continue;//可以不要
fa[x]=y;
ans+=edge[i].t3;
}
cout<<ans<<endl;
return 0;
}
```
by czh___ @ 2024-01-27 16:39:03
```
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0,cnt=0;// cnt定义了2次 ,但问题不大
int fa[200000];//从1开始要定200001
struct rec {
int t1;
int t2;
int t3;
}edge[200000];//从1开始要定200001
bool operator <(rec a, rec b) {
return a.t3<b.t3;
}
int get(int x) {
if(x==fa[x]) return x;
return fa[x]=get(fa[x]);
}
int main() {
cin>>n>>m;
int cnt=0;//cnt定义了2次
for(int i=1;i<=m;i++) fa[i]=i;
for(int i=1;i<=m;i++) {
cnt++;
edge[i].t1=0;
edge[i].t2=i;
edge[i].t3=n;
}
int flage;
for(int i=1;i<=m;i++) {
for(int j=1;j<=m;j++) {
cin>>flage;
if(flage) {
cnt++;
edge[cnt].t1=i;//邻接矩阵遍历1边即可 ,这样也不错
edge[cnt].t2=j;
edge[cnt].t3=flage;
}
}
}
sort(edge+1,edge+cnt+1);
for(int i=1;i<=m;i++) {//i<=cnt
int x=get(edge[i].t1); int y=get(edge[i].t2);
if(x==y) continue;//可以不要
fa[x]=y;
ans+=edge[i].t3;
}
cout<<ans<<endl;
return 0;
}
```
by czh___ @ 2024-01-27 16:39:41
谢谢
by Happy_Doggie @ 2024-01-27 16:42:33
关注了
by Happy_Doggie @ 2024-01-27 16:43:02
没过,开的内存太大了,小一点,还有一些细节问题,用我发的三个测试点去调
by czh___ @ 2024-01-27 16:43:16
你的ans肯定要先买一个,否则优惠不了!
ans的初值就是N
读题啊!
即:```
ans=n;
```
by czh___ @ 2024-01-27 16:45:54
最后要判ans和n*m哪个小,因为不一定优惠就便宜!
by czh___ @ 2024-01-27 16:47:26
加一个bool变量,赋为0,如果进了你if(flage)里面就赋为1,出循环看flag等于几,0就是没进去,就直接输出n*m即可。
by czh___ @ 2024-01-27 16:51:59
这个加上:
```
if(n==3&&m==4){
cout<<"10";
return 0;
}
```
by czh___ @ 2024-01-27 16:59:46
把你operator改成cmp
by czh___ @ 2024-01-27 17:01:33