代码
#include <bits/stdc++.h>
using namespace std;
struct s{
int v,w;
};
vector<vector<s> > G(1000005);
bool inq[1000005];
long long d[1000005];
queue<int> q;
void spfa(int s)
{
memset(inq,0,sizeof(inq));
memset(d,0x3f,sizeof(d));
q.push(s);
d[s]=0;
inq[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(auto e:G[u])
{
int v=e.v,w=e.w;
if(d[u]+w<d[v])
{
d[v]=d[u]+w;
if(!inq[v])
{
q.push(v);
inq[v]=1;
}
}
}
}
}
int main()
{
int n,m,cnt=1;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int a;
cin>>a;
s b;
b.w=-a;
if(n!=1&&m!=1)
{
if(i==1)
{
if(j!=m)
{
b.v=cnt+1;
G[cnt].push_back(b);
b.v=cnt+m;
G[cnt].push_back(b);
}
else
{
b.v=cnt+m;
G[cnt].push_back(b);
}
}
else if(i==n)
{
if(j!=m)
{
b.v=cnt+1;
G[cnt].push_back(b);
b.v=cnt-m;
G[cnt].push_back(b);
}
else
{
b.v=cnt-m;
G[cnt].push_back(b);
}
}
else
{
b.v=cnt+1;
G[cnt].push_back(b);
b.v=cnt+m;
G[cnt].push_back(b);
b.v=cnt-m;
G[cnt].push_back(b);
}
}
else if(n==1&&m!=1)
{
if(j!=m)
{
b.v=cnt+1;
G[cnt].push_back(b);
}
}
else if(m==1&&n!=1)
{
if(i==1)
{
b.v=cnt+m;
G[cnt].push_back(b);
}
else if(i==n)
{
b.v=cnt-m;
G[cnt].push_back(b);
}
else
{
b.v=cnt+m;
G[cnt].push_back(b);
b.v=cnt-m;
G[cnt].push_back(b);
}
}
cnt++;
}
}
spfa(1);
cout<<-(d[n*m]);
}