tjut 4318

来源:互联网 发布:web编程 编辑:程序博客网 时间:2024/06/02 06:49
#include<stdio.h> #include<string.h> struct haha {     int son[55];   //记录从当前点到其它能走到的点     double son_val[55];  //记录从当前点到其它能走到的点的消耗     int cnt;//记录存取的儿子个数 }a[50100]; int n,flag,s,t,M,used[50100]; double min[50100]; double find_short()//模拟以前数据比较小的时候的模板 {       int i,j,pos,cnt;       double mm;       memset(used,0,sizeof(used));       for(i=1;i<=n;i++) min[i]=1;       cnt=a[s].cnt;       while(cnt--)       {           min[a[s].son[cnt]]=a[s].son_val[cnt];       }       used[s]=1;       min[s]=0;       for(i=2;i<=n;i++)       {           mm=1;           for(j=1;j<=n;j++)           {               if(!used[j]&&mm>min[j])               {                   pos=j;                   mm=min[j];               }           }           if(mm==1) {flag=1;return 0;}           used[pos]=1;           cnt=a[pos].cnt;           for(j=0;j<cnt;j++)           {                if(!used[a[pos].son[j]]&&min[pos]+(1.0-min[pos])*a[pos].son_val[j]<min[a[pos].son[j]])                      min[a[pos].son[j]]=min[pos]+(1.0-min[pos])*a[pos].son_val[j];           }                   if(pos==t) return min[t];//这里很重要 不加会超时的哦        }       return min[t];  } int main() {     int i,m,x,y;     double val,k;     while(scanf("%d",&n)!=EOF)     {         flag=0;         for(i=1;i<=n;i++)             a[i].cnt=0;         for(i=1;i<=n;i++)         {             scanf("%d",&m);             while(m--)             {                 scanf("%d %d",&x,&y);                 val=y/100.0;                 a[i].son[a[i].cnt]=x;                 a[i].son_val[a[i].cnt++]=val;             }         }         scanf("%d %d %d",&s,&t,&M);         k=find_short();         if(flag==1) {printf("IMPOSSIBLE!\n");continue;}         printf("%.2lf\n",k*M);     }     return 0; } 

0 0
原创粉丝点击