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

題目鏈接:

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 0x3FFFF
int 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章