CodeForces 48E

来源:互联网 发布:淘宝金店可以买吗 编辑:程序博客网 时间:2024/05/29 08:06

最短路
最长路
有向图找环

#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;const int N=440;const int INF=0x3f3f3f3f;int aa[N],bb[N];int dp[N][N];queue<int> qq;int h,t,R,n,m;void spfa(int s1,int s2){    memset(dp,0x3f,sizeof(dp));    dp[s1][s2]=0;qq.push(s1);qq.push(s2);    while(!qq.empty()){        int u=qq.front();qq.pop();        int u1=qq.front();qq.pop();        //printf("%d %d\n",u,u1);        for(int i=1;i<=n&&i<=u;i++){            int v=u-i+aa[i],v1=u1+bb[i];            if(v+v1>R){                continue;            }            if(dp[v][v1]>dp[u][u1]+1){                dp[v][v1]=dp[u][u1]+1;                qq.push(v);qq.push(v1);            }        }        for(int i=1;i<=m&&i<=u1;i++){            int v=u+aa[n+i],v1=u1-i+bb[n+i];            if(v+v1>R)continue;            if(dp[v][v1]>dp[u][u1]+1){                dp[v][v1]=dp[u][u1]+1;                qq.push(v);qq.push(v1);            }        }    }}int vis[N][N];int dfs(int u,int v){    vis[u][v]=2;    for(int i=1;i<=n&&i<=u;i++){        int uu=u-i+aa[i],vv=v+bb[i];        if(uu+vv>R)continue;        if(!vis[uu][vv]){            if(dfs(uu,vv))return 1;        }        else if(vis[uu][vv]==2){            return 1;        }    }    for(int i=1;i<=m&&i<=v;i++){        int uu=u+aa[n+i],vv=v-i+bb[n+i];        if(uu+vv>R)continue;        if(!vis[uu][vv]){            if(dfs(uu,vv))return 1;        }        else if(vis[uu][vv]==2){            return 1;        }    }    vis[u][v]=1;    return 0;}int ans;void spfa1(int s1,int s2){    memset(dp,0,sizeof(dp));    memset(vis,0,sizeof(vis));    dp[s1][s2]=0;vis[s1][s2]=1;    qq.push(s1);qq.push(s2);    while(!qq.empty()){        int u=qq.front();qq.pop();        int u1=qq.front();qq.pop();        vis[u][u1]=0;        for(int i=1;i<=n&&i<=u;i++){            int v=u-i+aa[i],v1=u1+bb[i];            if(v+v1>R){                ans=max(ans,dp[u][u1]+1);                continue;            }            if(dp[v][v1]<dp[u][u1]+1){                dp[v][v1]=dp[u][u1]+1;                if(!vis[v][v1]){                    vis[v][v1]=1;                    qq.push(v);qq.push(v1);                }            }        }        for(int i=1;i<=m&&i<=u1;i++){            int v=u+aa[n+i],v1=u1-i+bb[n+i];            if(v+v1>R){                ans=max(ans,dp[u][u1]+1);                continue;            }            if(dp[v][v1]<dp[u][u1]+1){                dp[v][v1]=dp[u][u1]+1;                if(!vis[v][v1]){                    vis[v][v1]=1;                    qq.push(v);qq.push(v1);                }            }        }    }}int main(){    #ifdef DouBi    freopen("in.cpp","r",stdin);    #endif // DouBi    while(scanf("%d%d%d",&h,&t,&R)!=EOF){        scanf("%d",&n);        for(int i=1;i<=n;i++){            scanf("%d%d",&aa[i],&bb[i]);        }        scanf("%d",&m);        for(int i=1;i<=m;i++){            scanf("%d%d",&aa[n+i],&bb[n+i]);        }        spfa(h,t);        if(dp[0][0]!=INF){            printf("Ivan\n");            printf("%d\n",dp[0][0]);            continue;        }        memset(vis,0,sizeof(vis));        if(dfs(h,t)){            printf("Draw\n");            continue;        }        ans=0;        spfa1(h,t);        printf("Zmey\n");        printf("%d\n",ans);    }    return 0;}
0 0