题目
思路
按题意分层图就完了
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int head[101*101*101+101*101+10001],d[101*101*101+101*101+10001],n,m,a,bb,c,k,tot=1;
queue<int> q;
struct f{
int to,next,w;
} b[101*101*11*50];
bool book;
void add(int x,int y,int z)
{
b[tot].to=y;
b[tot].w=z;
b[tot].next=head[x];
head[x]=tot;
tot++;
}
bool vis[101*101*101+101*101+10001];
void spfa(int x)
{
q.push(x);
for (int i=1;i<=n*n*n+n*n+k;i++)
{
d[i]=2000*1000+20;
vis[i]=0;
}
vis[x]=1;
d[x]=0;
while (q.size())
{
int xx=q.front();
q.pop();
vis[xx]=0;
for (int i=head[xx];i;i=b[i].next)
{
if (d[b[i].to]>d[xx]+b[i].w)
{
d[b[i].to]=d[xx]+b[i].w;
if (vis[b[i].to]==0)
{
vis[b[i].to]=1;
q.push(b[i].to);
}
}
}
}
return;
}
int main()
{
cin>>n>>k>>a>>bb>>c;
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++)
{
cin>>book;
for (int kk=0;kk<=k;kk++)
{
if (i+1<=n)
{
if (!book)
{
if (kk!=0) add(i*n*n+j*n+kk,i*n*n+n*n+j*n+kk-1,0);
add(i*n*n+j*n+kk,i*n*n+n*n+j*n+k-1,a+c);
}
else add(i*n*n+j*n+kk,i*n*n+n*n+j*n+k-1,a);
}
if (j+1<=n)
{
if (!book)
{
if (kk!=0) add(i*n*n+j*n+kk,i*n*n+n+j*n+kk-1,0);
add(i*n*n+j*n+kk,i*n*n+n+j*n+k-1,a+c);
}
else add(i*n*n+j*n+kk,i*n*n+n+j*n+k-1,a);
}
if (i-1!=0)
{
if (!book)
{
if (kk!=0) add(i*n*n+j*n+kk,i*n*n-n*n+j*n+kk-1,bb);
add(i*n*n+j*n+kk,i*n*n-n*n+j*n+k-1,bb+a+c);
}
else add(i*n*n+j*n+kk,i*n*n-n*n+j*n+k-1,bb+a);
}
if (j-1!=0)
{
if (!book)
{
if (kk!=0) add(i*n*n+j*n+kk,i*n*n-n+j*n+kk-1,bb);
add(i*n*n+j*n+kk,i*n*n-n+j*n+k-1,bb+a+c);
}
else add(i*n*n+j*n+kk,i*n*n-n+j*n+k-1,bb+a);
}
}
}
spfa(n*n+n+k);
int mx=0x7fffffff;
for (int kk=0;kk<=k;kk++) mx=min(mx,d[n*n*n+n*n+kk]);
cout<<mx;
return 0;
}