PKU 2377 Bad Cowtractors

求最大生成树
方法是把边权*-1以后+一个极限值使权变成正的然后PRIM,最后用这个极限值*(n-1)-prim()就是答案了


  1. #include <iostream>
  2. using namespace std;
  3. #define MAXN 1000
  4. #define inf 3000000000
  5. int pre[MAXN],n;
  6. long long mat[MAXN][MAXN],Min[MAXN];
  7. long long prim(){
  8.     long long ret=0;
  9.     int v[MAXN],i,j,k;
  10.     for (i=0;i<n;i++)
  11.         Min[i]=inf,v[i]=0,pre[i]=-1;
  12.     for (Min[j=0]=0;j<n;j++){
  13.         for (k=-1,i=0;i<n;i++)
  14.             if (!v[i]&&(k==-1||Min[i]<Min[k]))
  15.                 k=i;
  16.         for (v[k]=1,ret+=Min[k],i=0;i<n;i++)
  17.             if (!v[i]&&mat[k][i]<Min[i])
  18.                 Min[i]=mat[pre[i]=k][i];
  19.     }
  20.     return ret;
  21. }
  22. int main()
  23. {
  24.     int i,j,t,x,y,len;
  25.     long long ans;
  26.     while(scanf("%d%d",&n,&t)!=EOF)
  27.     {
  28.         for(i=0;i<n;i++)for(j=0;j<n;j++)mat[i][j]=inf;
  29.         while(t--){
  30.             scanf("%d%d%d",&x,&y,&len);
  31.             if(len>100001-mat[x-1][y-1])
  32.             {
  33.                 mat[x-1][y-1]=mat[y-1][x-1]=100001-len;
  34.             }
  35.         }
  36.         ans=-prim()+100001*(n-1);
  37.         printf("%lld/n",ans<0?-1:ans);
  38.     }
  39.     return 0;
  40. }

你可能感兴趣的:(ini)