POJ+1258++Agri-Net

最小生成树,Kruskal模板题。

这题真他妈的坑爹,要不是看了龙哥博客,还不知道那行 80 字符是坑爹加没用的呢。这题不知道坑了多少人!


#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct vertex
{
      int val;
      int u;
      int v;
};
priority_queue<vertex> q;
int minx;
bool operator< (const vertex &a,const vertex &b)
{
      if(a.val > b.val) return 1;
      else return 0;
}
int id[110],sz[110];
bool cnet(int p,int q)
{
      int i,j;
      for(i = p;i != id[i];i = id[i]);
      for(j = q;j != id[j];j = id[j]);
      if(i == j) return 0;
      if(sz[i] < sz[j])
      {
            id[i] = j;sz[j] += sz[i];
      }
      else
      {
            id[j] = i;sz[i] += sz[j];
      }
      return 1;
}
void kru()
{
      while(!q.empty())
      {
            if(cnet(q.top().u,q.top().v) == 1)
            minx += q.top().val;
            q.pop();
      }
}
int main()
{
    int i,u,v,w,n;
    vertex tmp;
    while(scanf("%d",&n)!=EOF)
    {
          for(i = 0;i < 110;i ++) {id[i] = i;sz[i] = i;}
          for(u = 1;u <= n;u ++)
          for(v = 1;v <= n;v ++)
          {
                scanf("%d",&w);
                if(v > u){
            tmp.val = w;
            tmp.u = u;
            tmp.v = v;
            q.push(tmp);
            }
          }
          minx = 0;
          kru();
          printf("%d\n",minx);
          while(!q.empty()) q.pop();
    }

    return 0;
}


你可能感兴趣的:(POJ+1258++Agri-Net)