#include<bits/stdc++.h>
using namespace std;
#define int long long
struct edge
{
int to,cost;
};
typedef pair<int,int>P;
int n,a,b,c,d,dist[2][1010],ans=9e18,vis[1010];
vector<edge>G[2][1010];//G[0][i]:car;G[1][i]:train
void Dijk(int id,int s)
{
priority_queue<P>q;
memset(dist,0x3f3f3f3f,sizeof(dist));
memset(vis,0,sizeof(vis));
dist[id][s]=0;
vis[s]=1;
q.push(make_pair(0,s));
while(q.size())
{
P now=q.top();
q.pop();
int v=now.second,k=now.first;
if(vis[v])continue;
vis[v]=1;
for(int i=0;i<G[id][v].size();i++)
{
edge e=G[id][v][i];
int to=e.to,cost=e.cost;
if(dist[id][to]>dist[id][v]+cost)
{
dist[id][to]=dist[id][v]+cost;
q.push(make_pair(-dist[id][to],to));
}
}
}
}
signed main()
{
cin>>n>>a>>b>>c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>d;
G[0][i].push_back((edge){j,d*a});
G[1][i].push_back((edge){j,d*b+c});
}
}
Dijk(0,1);
ans=dist[0][n];
for(int i=2;i<=n;i++)
{
int di=dist[0][i];
Dijk(1,i);
di+=dist[1][n];
ans=min(ans,di);
}
cout<<ans;
return 0;
}
总是输出极大值。