poj1258Agri-Net

来源:互联网 发布:js加载乱码 编辑:程序博客网 时间:2024/05/16 06:12

题目连接:http://poj.org/problem?id=1258

         刚看到题目时感觉数据不好处理,后来发现把数据变化一下比较容易处理的方式,就是把个点和边长用结构

体表示,在用kruskal就OK了,就那么简单。



代码:

#include<stdio.h>#include <iostream>#include<string.h>#include<stdlib.h>#include<math.h>#include<algorithm>#include<list>#include<vector>#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;#define MAX 100010int father[MAX];struct node{    int x;    int y;    int w;}edge[MAX];bool cmp(node o1,node o2){    return o1.w<o2.w;}int Find_Set(int x){    if(x!=father[x])    {        father[x]=Find_Set(father[x]);    }    return father[x];}int kruskal(int n){    int sum=0;    int i,fx,fy;    for(i=0;i<n;i++)    {        int fx=Find_Set(edge[i].x);        int fy=Find_Set(edge[i].y);        if(fx!=fy)        {            father[fx]=fy;            sum+=edge[i].w;        }    }    return sum;}int main(){   int i,j,n,a[110][110];   while(scanf("%d",&n)!=EOF)   {       int k=0;       for(i=0;i<n;i++)       {           for(j=0;j<n;j++)            {                scanf("%d",&a[i][j]);                if(i<j)                {                    edge[k].x=i;                    edge[k].y=j;                    edge[k].w=a[i][j];                    k++;                }            }        }        for(i=0;i<n;i++)            father[i]=i;        sort(edge,edge+k,cmp);        printf("%d\n",kruskal(k));   }   return 0;}


原创粉丝点击