最短路
最长路
有向图找环
#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;
}