【codevs1961】躲避大龙

这个题挺有意思,需要多加一维时间,而且还要记得算出来加60,以防止出现数组下标为负数的情况

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,x,y,z,tail,head[10000],ans;
bool mmp[7070][125],flag;
struct in
{
    int mo,di;
};
struct es
{
    int to,ne,co;
}ing[18080];
inline void build(int f,int l,int c)
{
    ing[++tail].to=l,ing[tail].ne=head[f],ing[tail].co=c,head[f]=tail;
    ing[++tail].to=f,ing[tail].ne=head[l],ing[tail].co=c,head[l]=tail;
}
queue<in>qwq;
inline int bfs()
{
    while(!qwq.empty())
    {
        in qaq=qwq.front();
        for(int i=head[qaq.di];i;i=ing[i].ne)
        {
            int yu=(qaq.mo+ing[i].co)%60+60,t=ing[i].to;
            if(!mmp[t][yu])
                mmp[t][yu]=1,qwq.push((in){yu,t});
        }
        qwq.pop();
    }
    for(int i=0;i<=119;i++)
        if(mmp[2][i])
            return i;
    return -1;
}
int main()
{
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&x,&y,&z),build(x,y,z-z/60*60);
    qwq.push((in){60,1}),mmp[1][0]=1;
    ans=bfs();
    if(ans==-1)
        printf("60");
    else
    {
        ans=(ans+60)%60;
        if(ans<10)
            printf("0%d",ans);
        else
            printf("%d",ans);
    }
}

 

posted @ 2017-10-13 14:02  那一抹落日的橙  阅读(167)  评论(0编辑  收藏  举报