UVA 10801(p381)----Lift Hopping

来源:互联网 发布:凯立德导航端口查询 编辑:程序博客网 时间:2024/06/06 19:01
#include<iostream>#include<cstdio>#include<queue>#include<cmath>#include<cstring>using namespace std;int v[200],dist[200],n,k,lift[200];int now,g[200][200],t[200];queue<int> q;void solve(){    memset(v,0,sizeof(v));    memset(dist,127,sizeof(dist));    dist[0]=0;q.push(0);    while(!q.empty())    {        now=q.front();       // cout<<now<<endl;        q.pop();        for(int i=0;i<100;i++)        {            if(now==0)            {               if(dist[i]>dist[now]+g[now][i])                {                   dist[i]=dist[now]+g[now][i];                   if(!v[i])                    {                      q.push(i);                      v[i]=true;                    }                }            }            else              if(dist[i]>dist[now]+g[now][i]+60)                {                   dist[i]=dist[now]+g[now][i]+60;                   if(!v[i])                    {                      q.push(i);                      v[i]=true;                    }                }        }        v[now]=false;    }}int main(){    //freopen("in.in","r",stdin);    while(scanf("%d%d",&n,&k)!=EOF&&n)    {        memset(g,0x3f,sizeof(g));        for(int i=0;i<n;i++) scanf("%d",&t[i]);        for(int i=0;i<n;i++)        {            int num=0,x,c;            do{                scanf("%d",&lift[num++]);            }while(getchar()!='\n');            for(int j=0;j<num;j++)                for(int k=j+1;k<num;k++)                 {                   int temp=abs(lift[j]-lift[k])*t[i];                   g[lift[j]][lift[k]]=min(g[lift[j]][lift[k]],temp);                   g[lift[k]][lift[j]]=g[lift[j]][lift[k]];                 }        }      solve();      if(dist[k]<1e9) printf("%d\n",dist[k]);      else printf("IMPOSSIBLE\n");    }    return 0;}

0 0
原创粉丝点击