poj 1258 agri-net
题目大意:
最小生成树裸题
思路:
直接kruskal
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<cstdlib> using namespace std; int ans,a,k,n,f[10202]; struct edg { int x,y,dis; bool operator < (const edg &a) const { return dis<a.dis; } }edge[10202]; int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}//并查集 bool ok(int a,int b)//判断两个点是否已经连通 { int fa,fb; fa=find(a);fb=find(b); if(fa==fb) return true; else {f[fb]=fa;return false;} } void kruskal() { sort(edge,edge+k);//按照边排序使树最小 int cnt=1; for(int i=0;i<k;i++) { if(ok(edge[i].x,edge[i].y)==false) {ans+=edge[i].dis;cnt++;if(cnt==n) return ;}//如果两个边不连通就把这条边加进去 } } int main() { while(scanf("%d",&n)!=EOF) { k=0;ans=0; memset(f,0,sizeof(f)); for(int i=0;i<n;i++) { f[i]=i; for(int j=0;j<n;j++) { scanf("%d",&a); if(i!=j) {edge[k].x=i;edge[k].y=j;edge[k++].dis=a;} } } kruskal(); printf("%d\n",ans); } }
poj 1251 同
poj 2485 最小生成树最大边
poj 2377 最大生成树权值和