Pagini recente » Cod sursa (job #735001) | Cod sursa (job #2081572) | Cod sursa (job #361695) | Istoria paginii runda/simulare_de_oni_3/clasament | Cod sursa (job #1740375)
#include<cstdio>
#include<vector>
#include<queue>
#define MAXN 210
#define INF 2000000000
using namespace std;
int capacity[MAXN][MAXN],cost[MAXN][MAXN];
vector<int> g[MAXN];
queue<int> Queue;
int best[MAXN],dad[MAXN],inQueue[MAXN];
int n,source,sink;
void AddEdge(int a,int b){
g[a].push_back(b);
g[b].push_back(a);
capacity[a][b]=1;
}
bool BellmanFord(){
int i,node;
for(i=0;i<=2*n+1;i++)
best[i]=INF;
best[source]=0;
Queue.push(source);
inQueue[source]=1;
while(!Queue.empty()){
node=Queue.front();
Queue.pop();
inQueue[node]=0;
for(i=0;i<g[node].size();i++)
if(capacity[node][g[node][i]]!=0&&best[node]+cost[node][g[node][i]]<best[g[node][i]]){
best[g[node][i]]=best[node]+cost[node][g[node][i]];
dad[g[node][i]]=node;
if(inQueue[g[node][i]]==0){
inQueue[g[node][i]]=1;
Queue.push(g[node][i]);
}
}
}
if(best[sink]==INF)
return false;
return true;
}
int main(){
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
int i,j,answer=0,node;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&cost[i][j+n]);
cost[j+n][i]=-cost[i][j+n];
}
source=0;
sink=2*n+1;
for(i=1;i<=n;i++)
AddEdge(source,i);
for(i=1;i<=n;i++)
for(j=n+1;j<=2*n;j++)
AddEdge(i,j);
for(i=n+1;i<=2*n;i++)
AddEdge(i,sink);
while(BellmanFord()==true){
answer+=best[sink];
for(node=sink;node!=source;node=dad[node]){
capacity[dad[node]][node]--;
capacity[node][dad[node]]++;
}
}
printf("%d",answer);
return 0;
}