玄学RE

P1194 买礼物

```c #include<bits/stdc++.h> using namespace std; int fa[300010]; struct Edge{ int x,y,dis; }E[600010]; int n,m,tot,sum; int get(int x){ if (fa[x]==x) return x; return fa[x]=get(fa[x]); } void merge(int x,int y){ if (get(x)!=get(y)){ fa[get(x)]=y; } } bool cmp(Edge x,Edge y){ if (x.dis>y.dis) return 0; else return 1; } int read() { int ans=0,flag=1; char ch=getchar(); while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar(); if(ch=='-') flag=-1,ch=getchar(); while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar(); return ans*flag; } int main() { n=read(),m=read(); for (int i=1;i<=m;i++){ fa[i]=i; } int tot=0; for (int i=1;i<=m;i++){ for (int j=1;j<=m;j++){ int dis=read(); if (dis!=0&&dis<n) E[++tot].x=i,E[tot].y=j,E[tot].dis=dis; } } sort(E+1,E+tot+1,cmp); for (int i=1;i<=tot;i++){ if (get(E[i].x)!=get(E[i].y)&&E[i].dis!=0) merge(E[i].x,E[i].y),sum+=E[i].dis; } for (int i=1;i<=m;i++){ if (fa[i]==i) sum+=n; } cout<<sum<<endl; return 0; } ```
by Lovable_Wind @ 2021-10-07 21:37:03


最后的点可能优惠完比之前贵,re是因为矩阵5000*5000=25000000,要开这么大
by shark_big @ 2021-11-04 09:46:59


|