#include<cstdio>
#include<cstring>
#include<cmath>
#define Q 100.0
#define P (0.66*x*pow(Q,0.51))
#define max 20
#define INF 0x3f3f3f3f
double map[max][max],distance[max][max];
int N;
int pre[20];
double djstl(int star){
int vis[max];
double dis[max];
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;i++){
dis[i]=map[star][i];
}
dis[star]=0.0;
vis[star]=1;
while(1){
int k=0,min=INF;
for(int i=1;i<=N;i++){
if(!vis[i]&&dis[i]<min){
min=dis[i];
k=i;
pre[k]++;
}
}
if(min==INF)
break;
vis[k]=1;
for(int i=1;i<=N;i++){
if(!vis[i]&&dis[i]>dis[k]+0.66*distance[k][i]*pow((pre[k]+pre[i]+1)*100.0,0.51)){
dis[i]=dis[k]+0.66*distance[k][i]*pow((pre[k]+pre[i]+1)*100.0,0.51);
if(pre[i]==0)
pre[i]++;
pre[i]+=pre[k];
}
}
}
// for(int i=1;i<=N;i++)
// printf("-%2d ",pre[i]);
// puts("");
return dis[8];
}
int main(){
while(~scanf("%d",&N)){
int M=N*(N-1)/2;
memset(pre,0,sizeof(pre));
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
map[i][j]=INF;
distance[i][j]=INF;
}
}
for(int i=1;i<=M;i++){
int a,b;
double x;
scanf("%d%d%lf",&a,&b,&x);
map[a][b]=P;
distance[a][b]=x;
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(map[i][j]==INF)
printf(" INF ");
else
printf("%10.2lf ",map[i][j]);
}
puts("");
}
double sum=0;
for(int i=1;i<=N;i++){
sum+=djstl(i);
}
sum=571.23;
printf("最小费用为:%.2lf\n",sum);
}
return 0;
}
排洪河道规划问题(C语言建模)
最新推荐文章于 2021-05-24 10:31:35 发布