http://acm.timus.ru/problem.aspx?space=1&num=1416&&次小生成树

来源:互联网 发布:反编译 exe 知乎 编辑:程序博客网 时间:2024/04/24 01:52

这一题浪费了我不少时间啊,,,,很是伤心,,以前写过用prim添边删边的题,,于是果断安以前的方法去做结果是一个劲的wa,,,,,最后实在木办法了,就用krusal写 了一遍,结果很是给力,,过了,,

Ac代码:

#include<iostream>#define N 250010#define M 99999999#include<algorithm>using namespace std;struct Node{int a,b,c;       }aa[N];int n,m,len=0;int father[505],path[505];int cmp(const void* x,const void* y){return ((Node*)x)->c-((Node*)y)->c;}void init(){    cin>>n>>m;     for(int i=1;i<=m;++i)      cin>>aa[i].a>>aa[i].b>>aa[i].c;      qsort(aa+1,m,sizeof(Node),cmp);}int find(int a){ if(a==father[a]) return a;  else  a=find(father[a]);  return a;}int krusal(int k){   for(int i=1;i<=n;++i)    father[i]=i;    int res=0,t=0;    for(int i=1;i<=m;++i)     if(i!=k)     {       int x=find(aa[i].a);             int y=find(aa[i].b);              if(x!=y){ father[y]=x;                   res+=aa[i].c;                   if(k==0) path[++len]=i;                   ++t;                   if(t==n-1) return res;                    }                    }                    return M ;    }    int main()    {   init();       int n1=krusal(0);       cout<<"Cost: "<<n1<<endl;       int n2=M;       for(int i=1;i<=len;++i)         {  int sum=krusal(path[i]);           if(sum<n2) n2=sum;         }         if(n2==M)  n2=-1;          cout<<"Cost: "<<n2<<endl;          return 0;         //system("pause");       }

下面给出我的prim算法,,,希望哪位大牛看见时给指点一下,,,我到底错在哪,,,不胜感激。。。

ac代码:

#include<iostream>#include<cstdio>#include<algorithm>#define N 501#define M 999999999#define MM -99999999using namespace std;int map[N][N],maxs[N][N],dist[N];bool visit[N];int n,m,ans,maxn;bool prim(){    int  pre[N]={0};     int now=1;      dist[now]=0;      visit[now]=false;      for(int i=2;i<=n;++i)      { visit[i]=true;      dist[i]=map[now][i];         pre[i]=now;       }        ans=0;       for(int i=1;i<n;++i)       {    int minx=M;            for(int j=1;j<=n;++j)             if(visit[j]&&dist[j]<minx)               minx=dist[now=j];               visit[now]=false;               ans+=dist[now];               int pr=pre[now];               maxs[pr][now]=maxs[now][pr]=map[pr][now];                for(int j=1;j<=n;++j)                    if(!visit[j])            maxs[j][now]=max(maxs[j][pr],maxs[now][pr]);                        for(int j=1;j<=n;++j)                         if(visit[j]&&dist[j]>map[now][j])                           dist[j]=map[now][j],pre[j]=now;       }        maxn=M;        bool flag=false;        int sum=M;        for(int j=1;j<=n;++j)        for(int i=1;i<=n;++i)        {        if(pre[i]==j||pre[j]==i||map[i][j]==M) continue;        else     sum=ans+(map[i][j]-maxs[i][j]);        if(maxn>sum)  {maxn=sum; flag=true;}       }       if(flag)  return true;        else   return false;                         }int main(){   cin>>n>>m;    for(int j=1;j<=n;++j)    for(int i=1;i<=n;++i)      {map[i][j]=M;       maxs[i][j]=MM;       }      for(int i=1;i<=m;++i)       {    int a,b,c;            cin>>a>>b>>c;            if(map[a][b]>c)            map[a][b]=map[b][a]=c;            }             bool bb=prim();            cout<<"Cost: "<<ans<<endl;            if(bb) cout<<"Cost: "<<maxn<<endl;            else  cout<<"Cost: -1"<<endl;            return 0;            //system("pause");               }



原创粉丝点击