比赛 |
防止颓废的小练习v0.4 |
评测结果 |
AAAAAAAAAA |
题目名称 |
传纸条 |
最终得分 |
100 |
用户昵称 |
asddddd |
运行时间 |
0.046 s |
代码语言 |
C++ |
内存使用 |
2.23 MiB |
提交时间 |
2016-10-25 10:27:18 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define maxn 100000
#define maxe 52
using namespace std;
int asd[maxe][maxe];
int n,m,s;
int prevv[maxn],prevu[maxn];
struct edge{
int to,cap,cost,rev;
};
vector<edge>G[maxn];
void addedge(int from,int to,int cap,int cost){
G[from].push_back((edge){to,cap,cost,G[to].size()});
G[to].push_back((edge){from,0,-cost,G[from].size()-1});
}
void SPFA(int s){
queue<int>que;
que.push(s);
bool inq[maxn];
long long dist[maxn];
memset(prevu,0,sizeof(prevu));
memset(prevv,0,sizeof(prevv));
memset(inq,0,sizeof(inq));
memset(dist,-1,sizeof(dist));
dist[s]=0;
while(!que.empty()){
int k=que.front();
que.pop();
inq[k]=0;
for(int i=0;i<G[k].size();i++){
edge &e=G[k][i];
if((dist[e.to]==-1||dist[e.to]<dist[k]+e.cost)&&e.cap>0){
dist[e.to]=dist[k]+ e.cost;
prevv[e.to]=k;
prevu[e.to]=i;
if(!inq[e.to]){
que.push(e.to);
inq[e.to]=1;
}
}
}
}
}
void get_input(){
cin>>n>>m;
s=n*m;
int t=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int a;
cin>>a;
addedge(t,t+s,1,a);
if(i!=n)
addedge(t+s,t+m,1,0);
if(j!=m)
addedge(t+s,t+1,1,0);
t++;
}
}
addedge(1,1+s,1,0);
addedge(s,s*2,1,0);
return;
}
int work(){
SPFA(1);
int t=s*2;
int ans=0;
while(t!=1){
int v=prevv[t],u=prevu[t];
edge &e=G[v][u];
e.cap-=1;
G[e.to][e.rev].cap+=1;
ans+=e.cost;
t=prevv[t];
}
return ans;
}
int main(){
freopen("message.in","r",stdin);
freopen("message.out","w",stdout);
get_input();
cout<<work()+work();
}