8
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct info
{
int sign;
int up,down,uCover,dCover;
int sum;
};
const int MaxN=64;
int Cases,N,n,m,K,ans;
char dir;
info hor[MaxN+2][MaxN+1],ver[MaxN+1][MaxN+2];
info Nhor[MaxN+2][MaxN+1],Nver[MaxN+1][MaxN+2];
int Lhor[MaxN+1],Lver[MaxN+1];
void init()
{
int i;
memset(hor,0,sizeof(hor));
memset(ver,0,sizeof(ver));
for(i=0;i<n;i++)
{
hor[0][i].sign=hor[n][i].sign=1;
hor[0][i].sum=hor[n][i].sum=1;
ver[i][0].sign=ver[i][n].sign=1;
ver[i][0].sum=ver[i][n].sum=1;
}
for(i=0;i<=n;i++)
Lhor[i]=Lver[i]=i;
}
int get(int x,int s,int line,char dir)
{
if(dir=='D' || dir=='R')
return labs(x-line);
else if(line+line>=s)
{
if(x<=line)
return x;
return line-(x-line);
}
else
{
if(x>=line)
return s-x;
return (s-line)-line+x;
}
}
void work()
{
int i,j,k,nNew,mNew,x,y;
int line;
char dir;
scanf("%d%c",&line,&dir);
while(dir!='U' && dir!='D' && dir!='R' && dir!='L')
scanf("%c",&dir);
if(dir=='U' || dir=='D')
{
line=Lhor[line];
mNew=m;
if(line>n-line)
nNew=line;
else
nNew=n-line;
for(i=0;i<=N;i++)
Lhor[i]=get(Lhor[i],n,line,dir);
}
else
{
line=Lver[line];
nNew=n;
if(line>m-line)
mNew=line;
else
mNew=m-line;
for(i=0;i<=N;i++)
Lver[i]=get(Lver[i],m,line,dir);
}
memset(Nhor,0,sizeof(Nhor));
memset(Nver,0,sizeof(Nver));
for(i=0;i<nNew;i++)
Nver[i][0].sign=Nver[i][mNew].sign=1;
for(i=0;i<mNew;i++)
Nhor[0][i].sign=Nhor[nNew][i].sign=1;
if(dir=='U')
for(i=0;i<mNew;i++)
Nhor[nNew][i].sum=1;
if(dir=='D')
for(i=0;i<mNew;i++)
Nhor[0][i].sum=1;
if(dir=='L')
for(i=0;i<nNew;i++)
Nver[i][mNew].sum=1;
if(dir=='R')
for(i=0;i<nNew;i++)
Nver[i][0].sum=1;
for(i=0;i<=n;i++)
for(j=0;j<m;j++)
{
x=i;y=j;
if(dir=='U' || dir=='D')
x=get(x,n,line,dir);
else
y=get(y,m,line,dir);
if((dir=='R' && j<line) || (dir=='L' && j>=line))
y--;
if(Nhor[x][y].sign)
{
if(hor[i][j].sign)
Nhor[x][y].sum+=hor[i][j].sum;
else
Nhor[x][y].sum +=hor[i][j].down;
}
else
{
if(hor[i][j].sign)
{
if((i<line&&dir=='U') || (i>=line && dir=='D'))
Nhor[x][y].down+=hor[i][j].sum;
else
Nhor[x][y].up+=hor[i][j].sum;
}
else
{
if((i<line&&dir=='U') || (i>=line&&dir=='D') || (j<line&&dir=='L') || (j>=line&&dir=='R'))
{
Nhor[x][y].down=hor[i][j].down;
Nhor[x][y].dCover=1;
if(!Nhor[x][y].uCover)
Nhor[x][y].up+=hor[i][j].up;
}
else
{
Nhor[x][y].up=hor[i][j].down;
Nhor[x][y].uCover=1;
if(!Nhor[x][y].dCover)
Nhor[x][y].down+=hor[i][j].up;
}
}
}
}
for(i=0;i<n;i++)
for(j=0;j<=m;j++)
{
x=i;
y=j;
if(dir=='U' || dir=='D')
x=get(x,n,line,dir);
else
y=get(y,m,line,dir);
if((dir=='U' && i>=line) || (dir=='D'&&i<line))
x--;
if(Nver[x][y].sign)
{
if(ver[i][j].sign)
Nver[x][y].sum+=ver[i][j].sum;
else
Nver[x][y].sum+=ver[i][j].down;
}
else
{
if(ver[i][j].sign)
{
if((j<line&&dir=='L')||(j>=line&&dir=='R'))
Nver[x][y].down+=ver[i][j].sum;
else
Nver[x][y].up+=ver[i][j].sum;
}
else
{
if((i<line&&dir=='U')||(i>=line&&dir=='D')||(j<line&&dir=='L')||(j>=line&&dir=='R'))
{
Nver[x][y].down=ver[i][j].down;
Nver[x][y].dCover=1;
if(!Nver[x][y].uCover)
Nver[x][y].up+=ver[i][j].up;
}
else
{
Nver[x][y].up=ver[i][j].down;
Nver[x][y].uCover=1;
if(!Nver[x][y].dCover)
Nver[x][y].down+=ver[i][j].up;
}
}
}
}
memcpy(hor,Nhor,sizeof(hor));
memcpy(ver,Nver,sizeof(ver));
n=nNew;m=mNew;
}
int main()
{
while(scanf("%d %d",&n,&K) && (n||K))
{
n++;
N=m=n;
init();
for(;K;K--)
work();
ans=hor[0][0].sum-1+hor[1][0].sum-1+ver[0][0].sum-1+ver[0][1].sum-1;
printf("Case %d: %d pockets\n",++Cases,ans);
}
return 0;
}
9
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
const int MaxP=50;
int P,R,cases,i,j,k,sum,ans;
string name[MaxP],s1,s2;
int a[MaxP][MaxP];
int find(string s)
{
int i;
for(i=0;i<sum;i++)
if(name[i]==s)
return i;
name[sum]=s;sum++;
return sum-1;
}
bool init()
{
scanf("%d %d",&P,&R);
if(P==0&R==0)
return false;
sum=0;
memset(a,0,sizeof(a));
for(i=0;i<R;i++)
{
cin>>s1>>s2;
j=find(s1);
k=find(s2);
a[j][k]=a[k][j]=1;
}
return true;
}
int main()
{
cases=0;
while(init())
{
for(k=0;k<P;k++)
for(i=0;i<P;i++)
for(j=0;j<P;j++)
if(a[i][k]&&a[k][j])
if(a[i][j]==0||a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[j][i]=a[i][k]+a[k][j];
ans=0;
for(i=0;i<P;i++)
for(j=i+1;j<P;j++)
if(a[i][j]==0)
ans=P+10;
else if(a[i][j]>ans)
ans=a[i][j];
if(ans>P)
printf("Network %d: DISCONNECTED\n\n",++cases);
else
printf("Network %d: %d\n\n",++cases,ans);
}
return 0;
}
10
#include<stdio.h>
const int MaxN=100;
const int Max=1000;
int Cases,n,m,i,j,k,x,y;
int dis[MaxN][MaxN];
int tr[MaxN*MaxN*3];
int ans[MaxN][MaxN];
void Make(int n,int x,int y)
{
tr[n]=Max;
if(x==y)
return;
Make(n+n,x,(x+y)/2);
Make(n+n+1,(x+y)/2+1,y);
}
void Change(int n,int x,int y,int ch,int data)
{
if(x==y)
{
tr[n]=data;
}
else if((x+y)/2>=ch)
{
Change(n+n,x,(x+y)/2,ch,data);
if(tr[n+n]<tr[n+n+1])
tr[n]=tr[n+n];
else
tr[n]=tr[n+n+1];
}
else
{
Change(n+n+1,(x+y)/2+1,y,ch,data);
if(tr[n+n]<tr[n+n+1])
tr[n]=tr[n+n];
else
tr[n]=tr[n+n+1];
}
}
int Get_Min(int n,int x,int y)
{
if(x==y)
return x;
if(tr[n+n]<tr[n+n+1])
return Get_Min(n+n,x,(x+y)/2);
else
return Get_Min(n+n+1,(x+y)/2+1,y);
}
int main()
{
Cases=0;
while(scanf("%d %d",&n,&m)&&n)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dis[i][j]=Max;
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
dis[x-1][y-1]=1;
}
for(i=0;i<n;i++)
dis[i][i]=0;
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
Make(1,0,n*n-1);
Change(1,0,n*n-1,0,1);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ans[i][j]=Max;
ans[0][0]=1;
while(tr[1]<Max)
{
x=Get_Min(1,0,n*n-1);
y=x%n,x/=n;
if(x==1&&y==1)
break;
if(x!=y&&ans[y][x]<=Max&&ans[x][y]+dis[x][y]-1<ans[y][x])
{
ans[y][x]=ans[x][y]+dis[x][y]-1;
Change(1,0,n*n-1,y*n+x,ans[y][x]);
}
for(i=0;i<n;i++)
if(i!=x&&i!=y)
{
if(dis[x][i]==1&&ans[i][y]<=Max&&ans[x][y]+1<ans[i][y])
{
ans[i][y]=ans[x][y]+1;
Change(1,0,n*n-1,i*n+y,ans[i][y]);
}
if(dis[i][y]==1&&ans[x][i]<=Max&&ans[x][y]+1<ans[x][i])
{
ans[x][i]=ans[x][y]+1;
Change(1,0,n*n-1,x*n+i,ans[x][i]);
}
}
if(dis[x][y]==1&&ans[y][y]<=Max&&ans[x][y]<ans[y][y])
{
ans[y][y]=ans[x][y];
Change(1,0,n*n-1,y*n+y,ans[x][y]);
}
if(dis[x][y]==1&&ans[x][x]<=Max&&ans[x][y]<ans[x][x])
{
ans[x][x]=ans[x][y];
Change(1,0,n*n-1,x*n+x,ans[x][y]);
}
ans[x][y]=Max+1;
Change(1,0,n*n-1,x*n+y,ans[x][y]);
}
printf("Network %d\n",++Cases);
if(ans[1][1]==Max)
printf("Impossible\n\n");
else
printf("Minimum number of nodes = %d\n\n",ans[1][1]);
}
return 0;
}