题目大意:求最大生成树。 题目分析:转换一下思维,将最小改为最大就可以了,题目数据有重边,使用kruskal算法无影响,使用prim算法需要注意一下、每次应该取最大的。 代码: //kruskal算法可以避免重边的问题! #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define init(a,what) memset(a,what,sizeof(a)) #define read freopen("zx.in","r",stdin) #define write freopen("zx.out","w",stdout) const int MAXN=20000+10; const int N=1000+10; typedef struct { int p1,p2,cost; }ZX; ZX zx[MAXN]; int nnum,mnum,ans,sum,fa[N]; bool cmp(ZX a, ZX b) { return a.cost>b.cost; } int find(int x) { return fa[x]==x ? x: fa[x]=find(fa[x]); } bool merge(int a,int b) { int xx=find(a), yy=find(b); if(xx==yy) return false; else fa[yy]=xx; return true; } bool kruskal() { ans=0, sum=0; for(int i=1;i<=mnum;i++) { if(merge(zx[i].p1,zx[i].p2)) { ans++; sum+=zx[i].cost; } } if(ans==nnum-1) return true; return false; } int main() { read, write; while(scanf("%d%d",&nnum,&mnum)!=EOF) { for(int i=1;i<=nnum;i++) fa[i]=i; for(int i=1;i<=mnum;i++) { int a,b,cost; scanf("%d%d%d",&a,&b,&cost); zx[i].p1=a, zx[i].p2=b, zx[i].cost=cost; } sort(zx+1,zx+1+mnum,cmp); if(kruskal()) printf("%d/n",sum); else printf("-1/n"); } return 0; }