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);
    }
}

 

posted @ 2015-07-28 10:44  sweat123  阅读(159)  评论(0编辑  收藏  举报