BZOJ4053 : [Cerc2013]Subway

通过BFS可以求出到每个站点的最小花费。

每次从队首取出一个点,枚举所有它能花费1块钱就到达的线路,通过两遍递推求出最大时间。

注意到每个点和每条线路只有第一次使用时有用,所以总时间复杂度为$O(n+m)$。

 

#include
#include
#include
typedef unsigned long long ll;
const int N=300010,M=100010,E=1000010,inf=1000000000;
int Case,n,m,i,j,k,l,D,S,T,a[E],cnt,st[M],en[M],g[N],v[E],nxt[E],ed;
int q[N],h,t,d[N],f[N];bool vis[N],use[M];
char s[18000000],sS[55],sT[55];ll b[N];
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline bool check(char x){
  if(x>='a'&&x<='z')return 1;
  if(x>='A'&&x<='Z')return 1;
  if(x>='0'&&x<='9')return 1;
  return x=='-'||x=='\''||x=='&';
}
inline ll gethash(int l,int r){
  ll t=0;
  for(int i=l;i>1]==x)return mid;
    if(b[mid]=st[x];i--)if(d[a[i]]==D)up(tmp,f[a[i]]+i);else up(f[a[i]],tmp-i);
}
int main(){
  scanf("%d",&Case);
  while(Case--){
    scanf("%s",s);
    gets(s);
    l=strlen(s);
    for(n=i=0;i1)putchar('s');
    printf(", %d minute",f[T]);
    if(f[T]>1)putchar('s');
    puts("");
  }
  return 0;
}

  

你可能感兴趣的:(BZOJ4053 : [Cerc2013]Subway)