比赛 防止颓废的小练习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();
}