题目大意:给出1~n状态所作动作的贡献值,以及所作动作会转化为的状态。
所以,建立有向图,求最长路径。
因为,存在负边,所以用SPFA求解(将边权的符号反转,正常求解最短路即可)。
注:最后答案需要符号翻转。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
typedef long long ll;
using namespace std;
ll vis[1010]={0};
ll a[1010][1010],dis[1010];
vector<ll>vec[1010];
void spfa(){
queue<int>q;
q.push(1);
memset(dis,INF,sizeof(dis));
vis[1]=1;dis[1]=0;
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=0;
for(int i=0;i<vec[now].size();i++){
int x=vec[now][i];
if(dis[x]>dis[now]-a[now][i+1]){
dis[x]=dis[now]-a[now][i+1];
if(!vis[x]){
vis[x]=1;
q.push(x);
}
}
}
}
}
void solve(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int x;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>x;
vec[i].push_back(x);
}
}
spfa();
cout<<(-1*dis[n+1]);
}
int main(){
int _=1;
// cin>>_;
while(_--){
solve();
}
return 0;
}