kruskal样例没过求调

P1194 买礼物

@[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


| 下一页