最小生成树,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; }