比赛 |
防止颓废的小练习v0.4 |
评测结果 |
AAAAAA |
题目名称 |
方格取数 |
最终得分 |
100 |
用户昵称 |
asddddd |
运行时间 |
0.019 s |
代码语言 |
C++ |
内存使用 |
0.33 MiB |
提交时间 |
2016-10-25 10:14:02 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define maxn 1000
#define maxe 12
using namespace std;
int asd[maxe][maxe],n;
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;
int a,b,c;
while(cin>>a>>b>>c){
if(a==0)
break;
asd[a][b]=c;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int t=(i-1)*n+j+1,k=i*n+j+1,f=(i-1)*n+j+2;
addedge(t*2,t*2+1,1,asd[i][j]);
if(i!=n)
addedge(t*2+1,k*2,1,0);
if(j!=n)
addedge(t*2+1,f*2,1,0);
}
}
addedge(4,5,1,0);
addedge(((n-1)*n+n+1)*2,((n-1)*n+n+1)*2+1,1,0);
}
int work(){
SPFA(4);
int t=((n-1)*n+n+1)*2+1;
int ans=0;
while(t!=4){
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("fgqs.in","r",stdin);
freopen("fgqs.out","w",stdout);
get_input();
cout<<work()+work();
}