http://acm.pku.edu.cn/JudgeOnline/problem?id=2728 可以試試這道題。。。
思路AC后更新
已經ac,很慢。。。。巨慢!
部分代碼如下:
double?prim(int?n,double?rat)

{
????int?i,j,sign;
????int?flag[1000];
????double?dis[1000],sum;
????memset(flag,0,sizeof(flag));
????for(i=0;i<n;i++)
????????for(j=i;j<n;j++)
????????
{
????????????double?t=DIS(i,j)-map[i][j]*rat;
????????????cost[i][j]=t;
????????????cost[j][i]=t;
????????}
????for(i=0;i<n;i++)
????????dis[i]=cost[0][i];
????flag[0]=1;
????sum=0;
????for(j=1;j<n;j++)
????
{
????????double?min=100000000;
????????for(i=0;i<n;i++)
????????????if(!flag[i]&&min>dis[i])
????????????
{
????????????????sign=i;
????????????????min=dis[i];????
????????????}
????????flag[sign]=1;
????????sum+=dis[sign];
????????for(i=0;i<n;i++)
????????????if(!flag[i]&&dis[i]>cost[sign][i])
????????????????dis[i]=cost[sign][i];????
????}
????return?sum;????
}
while(1)
????????{
????????????mid=(low+high)/2;
????????????double?t=prim(n,mid);
????????????if(fabs(t)<1e-6)break;
????????????if(t<0)high=mid;
????????????else?low=mid;
????????}
