BZOJ3417 : Poi2013 Tales of seafaring

若x到y走k步可行,那么走k+2步也可行

以每个点为起点,BFS处理出到每个点走了奇数步、偶数步的最短路

对于一次询问,如果d不小于相应奇偶性的最短路,则可行

特判:对于孤立点,无论怎么走都不可行

 

#include<cstdio>
const int N=10010,Q=1000010;
int n,m,k,i,j,x,y,z,g[N],nxt[N],v[N],ed,G[N],NXT[Q],V[Q],W[Q],ED,dis[N][2],pos[N][2],q[N][2],h,t;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void ADD(int x,int y,int z){V[++ED]=y;W[ED]=z;NXT[ED]=G[x];G[x]=ED;}
inline void bfs(int x,int y,int z){if(pos[x][y]<i)pos[x][y]=i,dis[x][y]=z,q[++t][0]=x,q[t][1]=y;}
int main(){
  read(n),read(m),read(k);
  while(m--)read(x),read(y),add(x,y),add(y,x);
  while(k--)read(x),read(y),read(z),ADD(x,y,z);
  for(i=1;i<=n;i++)if(G[i]){
    h=1,t=0,bfs(i,0,0);
    while(h<=t)for(j=g[x=q[h][0]],y=q[h++][1];j;j=nxt[j])bfs(v[j],y^1,dis[x][y]+1);
    for(j=G[i];j;j=NXT[j])if((V[j]!=i||g[i])&&pos[V[j]][W[j]&1]==i&&dis[V[j]][W[j]&1]<=W[j])V[j]=0;
  }
  for(i=1;i<=ED;i++)puts(V[i]?"NIE":"TAK");
  return 0;
}

  

 

posted @ 2015-01-24 17:09  Claris  阅读(436)  评论(0编辑  收藏  举报