记录编号 | 235122 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [SDOI 2012]象棋 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.500 s | ||
提交时间 | 2016-03-10 11:04:06 | 内存使用 | 1.38 MiB | ||
#include<cstdio> #include<iostream> #include<algorithm> #include<deque> #include<cstring> using namespace std; const int SIZEN=110,INF=0x7fffffff/5000,SIZEK=510; int n,m,k,a,b; char s[SIZEN][SIZEN]; int x[SIZEK],y[SIZEK]; int kx[SIZEK],ky[SIZEK]; int dx[]={1,1,-1,-1},dy[]={1,-1,1,-1}; void read() { scanf("%d%d%d%d%d",&n,&m,&k,&a,&b); for(int i=0;i<n;i++) scanf("%s",s[i]); for(int i=1;i<=k;i++) scanf("%d%d",&x[i],&y[i]); for(int i=1;i<=k;i++) scanf("%d%d",&kx[i],&ky[i]); } int w[SIZEK][SIZEK]; int dis[SIZEN][SIZEN]; bool on(int x,int y) { if(x<=0||y<=0) return 0; if(x>n||y>m) return 0; if(s[x-1][y-1]=='*') return 0; return 1; } void bfs(int S) { deque<pair<int,int> > Q; Q.push_back(make_pair(x[S],y[S])); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dis[i][j]=INF*10; dis[x[S]][y[S]]=0; while(!Q.empty()) { int x=Q.front().first,y=Q.front().second;Q.pop_front(); for(int i=0;i<4;i++) { int nx=x+dx[i]*a,ny=y+dy[i]*b; if(on(nx,ny)&&dis[x][y]+1<dis[nx][ny]) { dis[nx][ny]=dis[x][y]+1; Q.push_back(make_pair(nx,ny)); } nx=x+dx[i]*b,ny=y+dy[i]*a; if(on(nx,ny)&&dis[x][y]+1<dis[nx][ny]) { dis[nx][ny]=dis[x][y]+1; Q.push_back(make_pair(nx,ny)); } } } } int lx[SIZEK],ly[SIZEK]={0},visitx[SIZEK],visity[SIZEK],slack[SIZEK]; int f[SIZEK]={0}; bool find(int x) { visitx[x]=1; for(int i=1;i<=k;i++) { if(visity[i]||!w[x][i]) continue; int t=lx[x]+ly[i]-w[x][i]; if(t==0) { visity[i]=1; if(f[i]==0||find(f[i])) { f[i]=x; return 1; } } else slack[i]=min(slack[i],t); } return 0; } int KM() { for(int i=1;i<=k;i++) lx[i]=INF; for(int i=1;i<=k;i++) { while(true) { memset(visitx,0,sizeof(visitx)); memset(visity,0,sizeof(visity)); for(int j=1;j<=k;j++) slack[j]=INF; if(find(i)) break; int d=INF; for(int j=1;j<=k;j++) if(!visity[j]) d=min(d,slack[j]); for(int j=1;j<=k;j++) if(visitx[j]) lx[j]-=d; for(int j=1;j<=k;j++) if(visity[j]) ly[j]+=d; //cout<<i<<" "<<d<<endl; } } int ans=0; for(int i=1;i<=k;i++) ans+=w[f[i]][i]; return ans; } void work() { for(int i=1;i<=k;i++) { memset(dis,0,sizeof(dis)); bfs(i); for(int j=1;j<=k;j++) w[i][j]=INF-dis[kx[j]][ky[j]]; } int ans; ans=INF*k-KM(); printf("%d",ans); } int main() { freopen("chessc.in","r",stdin); freopen("chessc.out","w",stdout); read(); work(); return 0; }