【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); } }