求最大生成树
方法是把边权*-1以后+一个极限值使权变成正的然后PRIM,最后用这个极限值*(n-1)-prim()就是答案了
方法是把边权*-1以后+一个极限值使权变成正的然后PRIM,最后用这个极限值*(n-1)-prim()就是答案了
- #include <iostream>
- using namespace std;
- #define MAXN 1000
- #define inf 3000000000
- int pre[MAXN],n;
- long long mat[MAXN][MAXN],Min[MAXN];
- long long prim(){
- long long ret=0;
- int v[MAXN],i,j,k;
- for (i=0;i<n;i++)
- Min[i]=inf,v[i]=0,pre[i]=-1;
- for (Min[j=0]=0;j<n;j++){
- for (k=-1,i=0;i<n;i++)
- if (!v[i]&&(k==-1||Min[i]<Min[k]))
- k=i;
- for (v[k]=1,ret+=Min[k],i=0;i<n;i++)
- if (!v[i]&&mat[k][i]<Min[i])
- Min[i]=mat[pre[i]=k][i];
- }
- return ret;
- }
- int main()
- {
- int i,j,t,x,y,len;
- long long ans;
- while(scanf("%d%d",&n,&t)!=EOF)
- {
- for(i=0;i<n;i++)for(j=0;j<n;j++)mat[i][j]=inf;
- while(t--){
- scanf("%d%d%d",&x,&y,&len);
- if(len>100001-mat[x-1][y-1])
- {
- mat[x-1][y-1]=mat[y-1][x-1]=100001-len;
- }
- }
- ans=-prim()+100001*(n-1);
- printf("%lld/n",ans<0?-1:ans);
- }
- return 0;
- }