zoj1665 dij变形
既然输入的是损坏率,那1-x就是剩余的。最后只要剩余的最大。
#include<stdio.h> #include<string.h> #define Max 99999999 const int maxn=1003; double dis[maxn],map[maxn][maxn]; int vis[maxn],n,val[maxn]; void init() { int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) map[i][j]=0; else map[i][j]=0; } void dij() { int i,j,pos; pos=n; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[i]=0; dis[pos]=1; // vis[pos]=1; for(i=1;i<=n;i++) { double min=-Max; for(j=1;j<=n;j++) { if(!vis[j]&&min<dis[j]) { pos=j; min=dis[j]; } } vis[pos]=1; for(j=1;j<=n;j++) { if(!vis[j]&&dis[j]<map[pos][j]*dis[pos]) dis[j]=map[pos][j]*dis[pos]; } } } int main() { int i,j,m; double cost; while(scanf("%d%d",&n,&m)!=EOF) { init(); for(i=1;i<n;i++) scanf("%d",&val[i]); for(i=1;i<=m;i++) { int x,y; scanf("%d%d%lf",&x,&y,&cost); if(map[x][y]<1-cost) map[x][y]=map[y][x]=1-cost; } /*for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { printf("%.2lf ",map[i][j]); } printf("\n"); }*/ double ans=0; dij(); /*for(i=1;i<=n;i++) printf("%d ",dis[i]); printf("\n");*/ for(i=1;i<n;i++) ans+=val[i]*dis[i]; printf("%.2lf\n",ans); } }