HDU 2722(POJ 3653) Here We Go(relians) Again (建图,最短路Dijstra)

来源:互联网 发布:qq好友提取软件 编辑:程序博客网 时间:2024/06/08 11:15

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2722

http://poj.org/problem?id=3653



题意:给你n*m的矩形街区,给你街区中每条路的通过的方向和行驶速度(每一小段路的路程为2520),求从左上角到右下角的最短时间。


AC代码:

#include <stdio.h>#include <string.h>#define MAXN 500#define INF 0x3FFFFint map[MAXN][MAXN],dis[MAXN],vis[MAXN];int Dijkstra(int from,int to){int i,j,min,u;memset(vis,0,sizeof(vis));for(i=1;i<=to;i++)        dis[i]=map[from][i];    dis[from]=0;    for(i=1;i<=to;i++)    {        u=0;        min=INF;        for(j=1;j<=to;j++)        {            if(!vis[j]&&dis[j]<min)            {                min=dis[j];                u=j;            }        }        vis[u]=1;        for(j=1;j<=to;j++)        {            if(!vis[j]&&dis[u]+map[u][j]<dis[j])dis[j]=dis[u]+map[u][j];        }    }return dis[to] ;}int main(){    int ans,x,y,h,s,i,j,n,m;    while(scanf("%d %d",&n,&m)!=EOF)    {        if(n==0&&m==0)            break;        for(i=0;i<=(n+1)*(m+1);i++)        {            for(j=0;j<=(n+1)*(m+1);j++)                map[i][j]=INF;        }        s=h=0;        for(i=1;i<=2*n+1;i++)        {            if(i%2==1)            {                for(j=1;j<=m;j++)                {                    char op;                    int v;                    scanf("%d %c",&v,&op);                    x=h*(m+1)+j;                    y=x+1;                    if(v==0)                    {                        map[x][y]=INF;                        map[y][x]=INF;                    }                    else if(op=='>')                    {                        map[x][y]=2520/v;                        map[y][x]=INF;                    }                    else if(op=='<')                    {                        map[x][y]=INF;                        map[y][x]=2520/v;                    }                    else                    {                        map[x][y]=2520/v;                        map[y][x]=2520/v;                    }                }                h++;            }            else            {                for(j=1;j<=m+1;j++)                {                    char op;                    int v;                    scanf("%d %c",&v,&op);                    x=s*(m+1)+j;                    y=(s+1)*(m+1)+j;                    if(v==0)                    {                        map[x][y]=INF;                        map[y][x]=INF;                    }                   else  if(op=='v')                    {                        map[x][y]=2520/v;                        map[y][x]=INF;                    }                    else if(op=='^')                    {                        map[x][y]=INF;                        map[y][x]=2520/v;                    }                    else                    {                        map[x][y]=2520/v;                        map[y][x]=2520/v;                    }                }                s++;            }        }        ans=Dijkstra(1,(n+1)*(m+1));        if(ans==INF)            printf("Holiday\n");        else            printf("%d blips\n",ans);    }    return 0;}


0 0
原创粉丝点击