poj 2485 Highways

来源:互联网 发布:天刀捏脸数据男五毒 编辑:程序博客网 时间:2024/06/11 19:25

最小生成树的应用,之前用过prim算法实现,现在用kruskal算法实现,用并查集;

开始的时候一直runtime error,是数组开的小的原因


AC代码如下:

#include <iostream>#include <cstdlib>#include <cstdio>#include <string>using namespace std;#define maxn (500+500)typedef struct node{int start;int end;int value;}node;node data[maxn*maxn];int father[maxn];int nodes;int cmp(const void* a,const void* b){node * aa = (node *)a;node * bb = (node *)b;return aa->value - bb->value;}int find(int x){if(x != father[x])father[x] = find(father[x]);return father[x];}int kruskal(int start,int count){qsort(data,count,sizeof(node),cmp);int ans = 0;for(int i=1;i<=nodes;i++)father[i] = i;int cnt = 0;for(int i =0;i<count;i++){int xx= find(data[i].start);int yy = find(data[i].end);if(xx == yy) continue;father[yy] = xx;if(data[i].value >ans)ans = data[i].value;cnt++;if(cnt == nodes-1)return ans;}return ans;}int main(){int cases;cin>>cases;while(cases--){memset(data,0,sizeof(data));memset(father,0,sizeof(father));cin>>nodes;int count=0;for(int i=1;i<=nodes;i++)for(int j=1;j<=nodes;j++){int weight;scanf("%d",&weight);if(i == j)continue;node t;t.start = i;t.end = j;t.value = weight;data[count] = t;count++;}cout<<kruskal(1,count)<<endl;}return 0;}


原创粉丝点击