Cod sursa(job #253290)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 17:10:17
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
 #include <cstdio>  
 #include <vector>  
 #include <queue>  
 #include <stack>  
 #include <list>  
 #include <set>  
 #include <algorithm>  
 #include <utility>  
 #include <string>  
 #include <functional>  
 #include <sstream>  
 #include <fstream>  
 #include <iostream>  
 using namespace std;  
 #define FOR(i,a,b) for (i=a;i<=b;i++)  
 #define fori(it,v) for (it=(v).begin();it!=(v).end();it++)  
 #define pb push_back  
 #define mp make_pair  
 #define fs first  
 #define ss second  
 #define all(c) c.begin(),c.end()  
 #define pf push_front  
 #define popb pop_back  
 #define popf pop_front  
 ifstream in("cc.in");  
 ofstream out("cc.out");  
 vector<int> dist(300),ver(300);  
 vector<vector<int> > a(300);  
 queue<int> q;  
 int d[300][300],pred[305],cap[300][300],n,cost;  
 int flux()  
 {  
     int nod,creste;  
     q.push(0);  
     vector<int>::iterator it;  
     pred[2*n+1]=0;  
     fill(all(dist),1<<30);  
     dist[0]=0;  
     while (!q.empty())  
     {  
         nod=q.front();  
         fori(it,a[nod])  
             if (cap[nod][*it]&&dist[nod]+d[nod][*it]<dist[*it])  
             {  
                 dist[*it]=dist[nod]+d[nod][*it];  
                 pred[*it]=nod;  
                 if(!ver[*it])  
                 {  
                     ver[*it]=1;  
                     q.push(*it);  
                 }  
   
             }  
         q.pop();  
         ver[nod]=0;  
     }  
     if (!pred[2*n+1])  
         return 0;  
     nod=2*n+1;  
     creste=1<<30;  
     while (nod)  
     {  
         creste=min(creste,cap[pred[nod]][nod]);  
         nod=pred[nod];  
     }  
     nod=2*n+1;  
     cost+=dist[2*n+1];  
     while (nod)  
     {  
         cap[pred[nod]][nod]-=creste;  
         cap[nod][pred[nod]]+=creste;  
         nod=pred[nod];  
     }  
     return 1;  
   
 }  
 int main()  
 {  
     int i,j;  
     in>>n;  
     FOR(i,1,n)  
         FOR(j,n+1,2*n)  
         {  
             in>>d[i][j];  
             d[j][i]=-d[i][j];  
             a[i].pb(j);  
             a[j].pb(i);  
             cap[i][j]=1;  
         }  
     FOR(i,1,n)  
     {  
         a[i].pb(0);  
         a[0].pb(i);  
         cap[0][i]=1;  
         a[i+n].pb(2*n+1);  
         a[2*n+1].pb(i+n);  
         cap[i+n][2*n+1]=1;  
     }  
     while (flux());  
     out<<cost<<'\n';  
     in.close();  
     out.close();  
     return 0;  
}