搜索
查看: 1623|回复: 0
打印 上一主题 下一主题

[题目/题解] [图论]红绿灯题解

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-20 20:43:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[图论]红绿灯题解[size=0.928571429]发表回复
红绿灯
【题目描述】
这一天Tom起晚了,为了更快的去上班,请帮他计算出一条最近的路线。Tom开车去工作,只有到了十字路口遇到红灯他才会停。那么他要多久才能到达公司呢?假设他的速度是1,并且当Tom出发的时候所有路口的灯都是红色。并且交通灯的红灯和绿灯同样长短,而且只有红绿两种颜色。Tom家门口和公司门口没有交通灯。
【输入】
第一行N(0 < N < 100)表示有N组测试数据。每一个测试数据第一行为整数M(0 < M < 100),接下来M行,每行包括像“a b 20 10”这样的数据。它表示Tom可以从a到b,a与b之间的距离为20,并且b处交通灯红灯(或绿灯)时长为10。每个测试样例的最后一行为Tom家和公司的名字,所有名字为小写字母。
【输出】
在一行中输出Tom使用的最短时间。
【样例输入】
1
4
t a 20 10
t b 10 9
b a 10 11
a c 20 0
t c
【样例输出】
40
【题解】
给出的题解是用dfs做的,但是本题应该用SPFA可以得到更好的效果





[code=Cpp width=740px]#include <stdio.h>
#define MAX 99999999
struct note
{
    int d;
    int t;
}E[27][27]={0};
int book[27]={0};

int start,end,min=MAX;

void dfs(int step,int time)
{
   
    int time1,i;
    printf("%d ",time);
   
    if(step==end)
    {
        if(time < min)
            min=time;
        return;
    }
    for(i=1; i<27;i++)
    {
        if(book==1)
            continue;
        if(E[step].d==MAX)
            continue;
        time1=time;
        time1+=E[step].d;
        if( E[step].t!=0 && time1 % (2*E[step].t) <  E[step].t )
            time1= time1 + ( E[step].t - time1 % (2*E[step].t) );
        book=1;
        dfs(i,time1);
        book=0;
    }
    return;
}

int main()
{
    freopen("test1.in","r",stdin);
    freopen("test1.out","w",stdout);
    int n,m,i,j,x,y;
    char ch1,ch2;
    scanf("%d",&n);
    getchar();
    for(i=1;i < 27;i++)
        for(j=1;j < 27;j++)
        {
            if(i==j)
            {
                E[j].d=MAX;
                E[j].t=MAX;
            }
            else
            {
                E[j].d=MAX;
                E[j].t=MAX;
            }
        }
        
    for(i=1;i <= n;i++)
    {
        scanf("%c %c %d %d",&ch1,&ch2,&x,&y);
        getchar();
        E[ch1-'a'+1][ch2-'a'+1].d=x;
        E[ch1-'a'+1][ch2-'a'+1].t=y;
    }
   
    scanf("%c %c",&ch1,&ch2);
    start=ch1-'a'+1;
    end=ch2-'a'+1;
   
    book[start]=1;
    dfs(start,0);
   
    printf("%d",min);
    return 0;
}
</stdio.h>[/code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表