这题比赛的时候写挂了,WA了将近十次也没找到问题。。。。刚刚重新写了一次,mle了一次。。这题卡内存还是挺紧的,然后改了下就a了。。。比赛的时候简直背啊。。。

1 #include<iostream> 2 #include<map> 3 #include<algorithm> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib> 7 #include<vector> 8 #define pb push_back 9 using namespace std; 10 typedef long long ll; 11 const int maxv=1e6+40; 12 int T,cas; 13 int N,M; 14 struct edge{ 15 int u,v,cap; 16 }; 17 vector<edge> G; 18 int field[1005][1005]; 19 int fa[maxv]; 20 void initFa(){ 21 for(int i=0;i<=N*M;i++) fa[i]=i; 22 } 23 int findFa(int x){ 24 if(fa[x]==x) return x; 25 else return fa[x]=findFa(fa[x]); 26 } 27 bool same(int x,int y){ 28 return findFa(x)==findFa(y); 29 } 30 void unite(int x,int y){ 31 fa[findFa(x)]=findFa(y); 32 } 33 int kruskall(){ 34 int added=0,ans=0,h=0; 35 initFa(); 36 while(added<N*M-1){ 37 int x=G[h].u,y=G[h].v,c=G[h].cap; 38 h++; 39 if(!same(x,y)) ans+=c,added++,unite(x,y); 40 } 41 return ans; 42 } 43 int drx[]={0,1}; 44 int dry[]={1,0}; 45 bool inRange(int x,int y){ 46 return x>=0&&x<N&&y>=0&&y<M; 47 } 48 int getN(int x,int y){ 49 return x*M+y; 50 } 51 void constuct(){ 52 G.clear(); 53 for(int i=0;i<N;i++){ 54 for(int j=0;j<M;j++){ 55 for(int k=0;k<2;k++){ 56 int dx=drx[k]+i,dy=dry[k]+j; 57 if(inRange(dx,dy)){ 58 G.pb((edge){getN(i,j),getN(dx,dy),abs(field[i][j]-field[dx][dy])}); 59 } 60 } 61 } 62 } 63 } 64 bool cmp(edge a,edge b){ 65 return a.cap<b.cap; 66 } 67 int main(){ 68 cin>>T; 69 while(T--){ 70 cin>>N>>M; 71 for(int i=0;i<N;i++){ 72 for(int j=0;j<M;j++){ 73 scanf("%d",&field[i][j]); 74 } 75 } 76 constuct(); 77 sort(G.begin(),G.end(),cmp); 78 printf("Case #%d: %d ",++cas,kruskall()); 79 } 80 return 0; 81 }