HDU5253(最小生成树)

来源:互联网 发布:临沂最专业的淘宝培训 编辑:程序博客网 时间:2024/05/12 05:46
////最小生成树有很多种算法   习惯用并查集+克鲁斯卡尔//  main.c//  example////  Created by Adam on 15/2/2.//  Copyright (c) 2015年 Adam. All rights reserved.//#include <iostream>#include "stdio.h"#include "stdlib.h"#include "string.h"#include "algorithm"#include <queue>using namespace std;int ss[1005][1005];int father[800000];int n,m;struct node {    int op,ed;    int ans;}edge[2000005];int find(int x){    if(x==father[x]) return x;    else return father[x]=find(father[x]);}int cmp(node x,node y){    return x.ans<y.ans;}int main(){    int t,pos,len,ans,cnt=0;    scanf("%d",&t);    while(t--)    {        pos=0;        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)                scanf("%d",&ss[i][j]);                for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            {                if(j!=m-1){                    edge[pos].op=i*m+j;                    edge[pos].ed=i*m+j+1;                    edge[pos++].ans=abs(ss[i][j]-ss[i][j+1]);                }                if(i!=n-1){                    edge[pos].op=i*m+j;                    edge[pos].ed=i*m+m+j;                    edge[pos++].ans=abs(ss[i][j]-ss[i+1][j]);                }            }                for(int i=0;i<n*m;i++)        {            father[i]=i;        }        sort(edge,edge+pos,cmp);        len=0;ans=0;        for(int i=0;i<pos;i++)        {            int a=edge[i].op;            int b=edge[i].ed;            a=find(a);            b=find(b);            if(a==b) continue;            father[a]=b;            len++;            ans+=edge[i].ans;            if(len==(n*m-1)) break;        }        printf("Case #%d:\n%d\n",++cnt,ans);    }    return 0;}

0 0
原创粉丝点击