UVa 259 Software Allocation Solution

#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <cstdlib>
#include <functional>
#include <string>
typedef unsigned long long ull;
using namespace std;
int s=36,t=37,mf,f,req;
vector<int> p;
vector<vector<int> > res;
void augment(int u,int minEdge){
    if(u==s){
        f=minEdge;
        return;
    }
    if(p[u]==-1)
        return;
    augment(p[u],min(minEdge,res[p[u]][u]));
    res[p[u]][u]-=f;
    res[u][p[u]]+=f;
}
int main(){
    while(!cin.eof()){
        res.assign(38,vector<int>(38,0));
        req=0;
        // for(int i=10;i<36;i++)
        //     res[s][i]=1000;
        for(int i=0;i<10;i++)
            res[i][t]=1;
        mf=0;
        string st;
        while(getline(cin,st)){
            // cout<<st.size()<<endl;
            if(st.size()==0)
                break;
            int app=st[0]-'A'+10;
            res[s][app]=st[1]-'0';
            req+=st[1]-'0';
            int i=3;
            while(i<st.size()-1){
                res[app][st[i++]-'0']=1;
            }
        }
        while(1){
            f=0;
            p.assign(38,-1);
            p[s]=s;
            queue<int> q;
            q.push(s);
            while(!q.empty()){
                int u=q.front();
                q.pop();
                if(u==t)
                    break;
                for(int i=0;i<38;i++)
                    if(res[u][i]>0&&p[i]==-1)
                        p[i]=u,q.push(i);
            }
            augment(t,1000);
            if(!f)
                break;
            mf+=f;
        }
        // cout<<mf<<endl;
        if(mf<req)
            cout<<'!'<<endl;
        else{
            vector<int> sol(10,-1);
            for(int comp=0;comp<10;comp++){
                for(int app=10;app<36;app++){
                    if(res[comp][app]){
                        sol[comp]=app-10;
                        break;
                    }
                }
            }
            for(int i=0;i<10;i++)
                if(sol[i]!=-1)
                    cout<<char(sol[i]+'A');
                else cout<<'_';
            cout<<endl;
        }
    }
}

Comments