(LightOj) 1141 – Number Transformation

0

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here



#define MAXX 1007

vector<int>factors[MAXX];

vector<int>primes;

void generatePrimes()
{
    bool isPrime[MAXX];

    mem(isPrime, 1);

    int root = sqrt(MAXX) + 7;

    for(int i=3; i<root; i++)
    {
        if(isPrime[i])
        {
            for(int j=i*i; j<MAXX; j+=(2*i))
            {
                isPrime[j] = false;
            }
        }
    }

    for(int i=2; i<MAXX;)
    {
        if(isPrime[i])
        {
            for(int j=2; i*j < MAXX; j++)
            {
                factors[i*j].pb(i);
            }
        }

        if(i == 2)
        {
            i++;
        }
        else
        {
            i += 2;
        }
    }
}


void init()
{
    generatePrimes();
}




int bfs(int source, int target)
{
    bool visited[MAXX];

    int dist[MAXX];

    mem(dist, -1);

    mem(visited, 0);


    queue<int>Q;

    Q.push(source);

    visited = true;
    dist = 0;

    while(!Q.empty())
    {
        int u = Q.front(); Q.pop();

        loop(i, SZ(factors[u]))
        {
            int v = u + factors[u][i];

            if( (v <= target) && !visited[v] )
            {
                visited[v] = true;
                dist[v] = dist[u] + 1;
                if(v == target)
                {
                    break;
                }
                Q.push(v);
            }
        }
    }

    return dist[target];
}


int main()
{
    init();


    int kases, kaseno = 0;

    int s, t;

    sf("%d", &kases);

    while(kases--)
    {
        sf("%d %d", &s, &t);
        pf("Case %d: %d\n", ++kaseno, bfs(s, t));
    }

    return 0;
}

(USACO) Magic Squares

0
//link: http://cerberus.delos.com:790/usacoprob2?a=gfh3ra4EtuK&amp;S=msquare
/*
ID: himuhas1
TASK: msquare
LANG: C++
*/



#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;

#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;
struct ASDFG{
    template<typename T>
    ASDFG& operator,(vector<T> &v){
        pf("[");
        cout<<v[0];
        FOR(i, 1, SZ(v)){
            cout<<", "<<v[i];
        }
        pf("]");
        return *this;
    }

    template<typename T>
    ASDFG& operator,(T x) {
        cout<<x<<" ";
        return *this;
    }


}asdfg;



//Header ends here
map<string, string>nodes;


void transformA(string &s)
{
    loop(i, 4)
    {
        swap(s[i], s[7-i]);
    }
}

void transformB(string &s)
{
    loop(i, 3)
    {
        swap(s[i], s[3]);
        swap(s[7-i], s[4]);
    }
}

void transformC(string &s)
{
    swap(s[1], s[6]);
    swap(s[5], s[6]);
    swap(s[2], s[5]);
}


int main()
{
    #ifndef hasibpc
        read("msquare.in");
        write("msquare.out");
    #endif

    string target;

    {
        char c;
        loop(i, 8)
        {
            scanf("%c", &c);
            cin.ignore();
            target.push_back(c);
        }
    }

    //dump(target);

    queue<string>Q;
    string current = "12345678";
    nodes[current] = "-";

    Q.push(current);
    string ss;
    string *ptr;


    while(!Q.empty())
    {
        current = Q.front();
        Q.pop();

        //dump(current);

        ss = current;
        transformA(ss);
        //dump(ss);
        ptr = &nodes[ss];
        if((*ptr).size() == 0)
        {
            *ptr = current;
            if(*ptr == target) break;
            Q.push(ss);
        }




        ss = current;
        transformB(ss);
        //dump(ss);
        ptr = &nodes[ss];
        if((*ptr).size() == 0)
        {
            *ptr = current;
            if(*ptr == target) break;
            Q.push(ss);
        }



        ss = current;
        transformC(ss);
        //dump(ss);
        ptr = &nodes[ss];
        if((*ptr).size() == 0)
        {
            *ptr = current;
            if(*ptr == target) break;
            Q.push(ss);
        }
    }



    string result;
    //dump(*ptr);

    while(target != "12345678")
    {
        ptr = &nodes[target];

        if((*ptr)[0] == target[7])
        {
            result.pb('A');
        }
        else if((*ptr)[0] == target[0])
        {
            result.pb('C');
        }
        else
        {
            result.pb('B');
        }

        target = *ptr;
    }

    reverse(all(result));
    pf("%d\n", SZ(result));
    cout<<result<<endl;




    return 0;
}

Overfencing (USACO)

0
/*
ID: himuhas1
TASK: maze1
LANG: C++
*/



#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<utility>
#include<string>

#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d %d", &a, &b)
#define sf scanf
#define pf printf
#define pb push_back
#define fr first
#define sc second
#define MP make_pair
#define PI acos(-1.0)
#define INF 1<<29;
#define ll long long
#define paii pair<int, int>
#define all(v) v.begin(), v.end()
#define SZ(a) int(a.size())
#define dd double
#define mem(a, v) memset(a, v, sizeof(a))
#define dump(x) cout<<#x<<" = "<<(int)x<<endl;


using namespace std;

#define CONDITION -1 < tmp.fr && tmp.fr < rows && -1 < tmp.sc && tmp.sc < columns && graph[tmp.fr][tmp.sc] ==' '

int columns, rows;
char graph[202][78];

paii exits[2];

int bfs(paii u, paii v)
{
    //dump(u.fr); dump(u.sc); dump(v.fr); dump(v.sc);
    char dir[] = {-1, 0, 1, 0};
    int dist[202][78];
    bool visited[202][78];
    int finalDist = 0;
    mem(visited, 0);

    paii tmp;


    loop(i, 4)
    {
        tmp.fr = u.fr + dir[i];
        tmp.sc = u.sc + dir[(i+1)%4];

        if(CONDITION)
        {
             u = tmp;
             break;
        }
    }

    loop(i, 4)
    {
        tmp.fr = v.fr + dir[i];
        tmp.sc = v.sc + dir[(i+1)%4];

        if(CONDITION)
        {
             v = tmp;
             break;
        }
    }



    dist[u.fr][u.sc] = dist[v.fr][v.sc] = 0;
    visited[u.fr][u.sc] = visited[v.fr][v.sc] = 1;
    queue<paii>Q;
    Q.push(u);
    Q.push(v);



    while(!Q.empty())
    {
        u = Q.front(); Q.pop();
        loop(i, 4)
        {
            tmp.fr = u.fr + dir[i];
            tmp.sc = u.sc + dir[(i+1)%4];
            if(CONDITION)
            {
                tmp.fr += dir[i];
                tmp.sc += dir[(i+1)%4];
                if(CONDITION && !visited[tmp.fr][tmp.sc] )
                {
                    //dump(u.fr); dump(u.sc); dump(tmp.fr); dump(tmp.sc); cout<<endl;
                    visited[tmp.fr][tmp.sc] = 1;
                    finalDist = max(dist[tmp.fr][tmp.sc] = dist[u.fr][u.sc] + 1, finalDist);
                    //dump(finalDist);
                    Q.push(tmp);
                }
            }


        }
    }
    return finalDist+1;

}



int main()
{
    #ifndef hasibpc
    freopen("maze1.in", "r", stdin);
    freopen("maze1.out", "w", stdout);
    #endif
    gi2(columns, rows);
    columns = columns*2 + 1;
    rows = rows*2 + 1;

    cin.ignore();
    loop(i, rows)
    {
        gets(graph[i]);
    }

    {
        char x = 0;
        for(int i=1; i<columns; i++)
        {
            //dump(graph[0][i]);
            //dump(i);
            if(graph[0][i] == ' ')
                exits[x++] = MP(0, i);

            if(graph[rows-1][i] == ' ')
                exits[x++] = MP(rows-1, i);
        }

        for(int i=1; i<rows; i++)
        {
            //dump(graph[i][0]);
            //cout<<int(graph[i][0])<<" "<<int(' ')<<endl;

            if(graph[i][0] == ' ')
                exits[x++] = MP(i, 0);
            if(graph[i][columns-1] == ' ')
                exits[x++] = MP(i, columns-1);
        }
        //dump(x);
    }


    cout<<bfs(exits[0], exits[1])<<endl;

    return 0;
}




(USACO) Healthy Holsteins

0
/*
ID: himuhas1
TASK: holstein
LANG: C++
link: http://cerberus.delos.com:790/usacoprob2?S=holstein&a=9j5vF1aY3NU
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;

#define MAXX 32772 //1<<15 + 1
#define debug

struct DATA{
    int amount[26];
} scoops[MAXX], rqr, inp[16];

int countBit(int n)
{
    if(n==0)
    {
        return 0;
    }
    return 1 + countBit(n>>1);
}


int main()
{
    #ifndef hasibpc
        freopen("holstein.in", "r", stdin);
        freopen("holstein.out", "w", stdout);
    #endif // hasibpc


    int number_of_vitamins, G;


    gi(number_of_vitamins);
    loop(i, number_of_vitamins)
    {
        gi(rqr.amount[i]);
    }

    gi(G);

    loop(i, G)
    {
        loop(j, number_of_vitamins)
        {
            gi(inp[i].amount[j]);
        }
    }

    int till = (1<<(G));

    mem(scoops[0].amount, 0);
    /*
    loop(i, G)
    {
        cout<<scoops[0].amount[i]<<"   ";
    }
    */

    int pre, best = ~(1<<29);

    bool valid;


    FOR(i, 1, till)
    {
        pre = i & ~(1<<(countBit(i)-1));
        //pf("i=%d, pre=%d\n", i, pre);
        valid = 1;
        loop(j, number_of_vitamins)
        {
            scoops[i].amount[j] = scoops[pre].amount[j] + inp[countBit(i)-1].amount[j];
            if(scoops[i].amount[j] < rqr.amount[j])
                valid = 0;
        }
        if(valid)
        {
            if(__builtin_popcount(best) > __builtin_popcount(i))
            {
                best = i;
                //cout<<"best updated"<<endl;
            }
        }
        #if 0
        else
        {
            cout<<i<<" is not valid"<<endl;
            loop(k, number_of_vitamins)
            {
                cout<<scoops[i].amount[k]<< " ";
            }
            cout<<endl;
        }
        #endif

    }


    //cout<<"came here"<<endl;
    pf("%d", __builtin_popcount(best));
    //return 00;
    //cout<< "best = " << best <<endl;

    for(int i=0; (1<<i) <= best; i++)
    {
        if(best & (1<<i))
        {
            pf(" %d", i+1);
        }
    }
    puts("");


    return 0;
}

(USACO) The Castle

1
/*
user: himuhas1
link: http://cerberus.delos.com:790/usacoprob2?a=0Hi6SPQOgMg&S=castle
*/

/*
ID: himuhas1
TASK: castle
LANG: C++
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)
#define INF 1<<29
using namespace std;

#define MAXX 52

int graph[MAXX][MAXX];
int component[MAXX][MAXX];
int column, row;
vector<int>cntElements;
bool visited[MAXX][MAXX];
char dirx[] = {-1, 0, 1, 0};
char diry[] = {0 , -1, 0, 1};

void bfs(int i, int j)
{
    paii u, v;
    u.fr = i;
    u.sc = j;
    visited[i][j] = 1;

    queue<paii>Q;
    Q.push(u);

    while(!Q.empty())
    {
        u = Q.front(); Q.pop();


        component[u.fr][u.sc] = SZ(cntElements) - 1;
        cntElements[ component[u.fr][u.sc] ]++;

        loop(i, 4)
        {
            if( ((graph[u.fr][u.sc] & (1<<i)) == 0 ))
            {
                //pf("%d & %d = %d\n", graph[u.fr][u.sc], (1<<i), 0);
                v.fr = u.fr + diry[i];
                v.sc = u.sc + dirx[i];

                if(!visited[v.fr][v.sc])
                {
                    //pf("(%d, %d) -> (%d, %d)\n", u.fr, u.sc, v.fr, v.sc);
                    visited[v.fr][v.sc] = 1;
                    Q.push(v);
                }
            }
        }
        //break;
    }

}



void setComponent()
{
    mem(visited, 0);

    loop(i, row)
    {
        loop(j, column)
        {
            if(!visited[i][j])
            {
                cntElements.pb(0);
                bfs(i, j);
            }
        }
    }


}


int main()
{
    freopen("castle.in", "r", stdin);
    freopen("castle.out", "w", stdout);
    int longestRoom;
    gi2(column, row);

    loop(i, row)
    {
        loop(j, column)
        {
            gi(graph[i][j]);
        }
    }




    setComponent();

    pf("%d\n", SZ(cntElements));

    longestRoom = -INF;
    loop(i, SZ(cntElements))
    {
        longestRoom = max(longestRoom, cntElements[i]);
    }
    pf("%d\n", longestRoom);

    longestRoom = -1;
    paii pos, v;
    char ch;
    for(int j=column-1; -1 < j; j--)
    {
        for(int i=0; i<row; i++)
        {
            for(int c=2; 0 < c; c--)
            {
                if( (graph[i][j] & (1<<c)) != 0 )
                {
                    v.fr = i + diry[c];
                    v.sc = j + dirx[c];
                    if(v.fr < 0 || v.sc >= column) continue;

                    if(component[i][j] != component[ v.fr ][ v.sc ] && longestRoom <= cntElements[ component[i][j] ] + cntElements[component[ v.fr ][ v.sc ]] )
                    {
                        longestRoom = cntElements[ component[i][j] ] + cntElements[component[ v.fr ][ v.sc ]];
                        pos.fr = i;
                        pos.sc = j;
                        ch = (c==1?'N':'E');
                    }
                }

            }
        }
    }
    cout<<longestRoom<<endl;
    cout<<pos.fr+1<<" "<<pos.sc+1<<" "<<ch<<endl;


    return 0;
}



(UVa) 571 – Jugs

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=512
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 1002

pair<int, paii>state[MAXX][MAXX];
bool visited[MAXX][MAXX];
int target;
int cA, cB;
vector<int>result;
string command[] = {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};

void bfs()
{
    mem(visited, 0);
    paii u, v;
    u.fr = u.sc = 0;
    visited[0][0] = 1;
    queue<paii>Q;
    Q.push(u);
    int quan;

    while(!Q.empty())
    {
        u = Q.front(); Q.pop();



        //change 1
        v = u;
        v.fr = cA;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 0;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;



            if(v.sc == target) break;
            Q.push(v);
        }

        //change 2
        v = u;
        v.sc = cB;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 1;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }

        //change 3
        v = u;
        v.fr = 0;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 2;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }

        //change 4
        v = u;
        v.sc = 0;
        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 3;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }

        //change 5
        v = u;
        quan = min(v.fr, cB - v.sc);
        v.fr -= quan;
        v.sc += quan;
        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 4;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }


        //change 6
        v = u;
        quan = min(v.sc, cA - v.fr);

        v.sc -= quan;
        v.fr += quan;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 5;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }
    }



    result.clear();

    while(v.fr + v.sc != 0)
    {
        result.pb( state[v.fr][v.sc].fr );
        v = state[v.fr][v.sc].sc;
    }
    reverse(all(result));
    loop(i, SZ(result))
    {
        cout<<command[ result[i] ]<<endl;
    }
    cout<<"success"<<endl;
}





int main()
{
    while(sf("%d %d %d", &cA, &cB, &target) == 3)
    {
        bfs();
    }
    return 0;
}



(USACO) Mother’s Milk

0
/*
ID: himuhas1
TASK: milk3
LANG: C++
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 21

struct DATA{
    int q[3];
}u,v;

int maxAbility[3];

bool visited[MAXX][MAXX][MAXX];
vector<int>result;

void bfs()
{
    visited[u.q[0]][u.q[1]][u.q[2]] = 1;
    queue<DATA>Q;
    Q.push(u);
    int quantity;

    while(!Q.empty())
    {
        u = Q.front(); Q.pop();

        if(u.q[0] == 0) result.pb(u.q[2]);

        loop(i, 3)
        {
            loop(j, 3)
            {
                if(i == j) continue;

                loop(k, 3) v.q[k] = u.q[k];

                quantity = min(u.q[i], maxAbility[j] - u.q[j]);

                v.q[i] -= quantity;
                v.q[j] += quantity;

                if(!visited[v.q[0]][v.q[1]][v.q[2]])
                {
                    visited[v.q[0]][v.q[1]][v.q[2]] = 1;
                    Q.push(v);
                }

            }
        }
    }


}




int main()
{
    freopen("milk3.in", "r", stdin);
    freopen("milk3.out", "w", stdout);

    loop(i, 3) cin>>maxAbility[i];
    u.q[0] = u.q[1] = 0;
    u.q[2] = maxAbility[2];

    bfs();

    sort(all(result));

    pf("%d", result[0]);
    FOR(i, 1, SZ(result))
        pf(" %d", result[i]);
    pf("\n");




    return 0;
}

(USACO) The Clocks (IOI’94-DAY 2)

0
/*
user: himuhas1
link: http://cerberus.delos.com:790/usacoprob2?a=dTQL99FvdOh&S=clocks
*/

/*
ID: himuhas1
TASK: clocks
LANG: C++
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 9

#define isSet(ara, gd) ara[gd[0]][gd[1]][gd[2]][gd[3]][gd[4]][gd[5]][gd[6]][gd[7]][gd[8]]


struct DATA{
    int state[9];
};

int grid[9];
string moves[MAXX];
int dir[4][4][4][4][4][4][4][4][4];



void bfs()
{
    bool visited[4][4][4][4][4][4][4][4][4];
    mem(visited, 0);
    bool isSolution;

    isSet(visited, grid) = 1;

    DATA u, v;

    loop(i, 9)
    {
        u.state[i] = grid[i];
    }

    queue<DATA>Q;
    Q.push(u);

    while(!Q.empty())
    {
        u = Q.front(); Q.pop();

        loop(i, 9)
        {
            loop(j, 9)
            {
                v.state[j] = u.state[j];
            }

            loop(j, SZ(moves[i]))
            {
                v.state[ moves[i][j] - 'A' ] =  (v.state[ moves[i][j] - 'A' ] + 1) % 4;
            }
            if( isSet(visited, v.state) == 0 )
            {
                isSet(visited, v.state) = 1;
                isSolution = 1;

                loop(i, 9)
                {
                    if(v.state[i] != 3)
                    {
                        isSolution = 0;
                        break;
                    }
                }

                isSet(dir, v.state) = i;


                if(isSolution)
                {
                    return;
                }

                Q.push(v);
            }

        }

    }




}




int main()
{
    freopen("clocks.in", "r", stdin);
    freopen("clocks.out", "w", stdout);


    moves[0] = "ABDE";
    moves[1] = "ABC";
    moves[2] = "BCEF";
    moves[3] = "ADG";
    moves[4] = "BDEFH";
    moves[5] = "CFI";
    moves[6] = "DEGH";
    moves[7] = "GHI";
    moves[8] = "EFHI";


    loop(i, 9)
    {
        cin>>grid[i];
        grid[i] = (grid[i]/3) - 1;
    }
    bfs();

    DATA u;
    loop(i, 9) u.state[i] = 3;

    vector<int>result;
    int id;

    bool isSolution = 1;

    while(1)
    {
        isSolution = 1;
        id = isSet(dir, u.state);

        result.pb(id+1);

        loop(i, SZ(moves[id]))
        {
            u.state[ moves[id][i] - 'A' ] = (u.state[ moves[id][i] - 'A' ] + 3) % 4;
        }

        loop(i, 9)
        {
            if(u.state[i] != grid[i])
            {
                isSolution = 0;
                break;
            }
        }

        if(isSolution) break;
    }

    sort(all(result));

    cout<<result[0];

    FOR(i, 1, SZ(result))
    {
        cout<<" "<<result[i];
    }
    cout<<endl;



    return 0;
}



(UVa) 315 – Network

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=251
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 101
int cntPlaces;
vector<int>graph[MAXX];


bool bfs(int not_to_visit)
{
    bool visited[MAXX];
    mem(visited, 0);
    int totalVisited = 1;
    int u = (not_to_visit + 1) % cntPlaces;
    int v;
    queue<int>Q;
    Q.push(u);
    visited[u] = 1;
    while( !Q.empty() )
    {
        u = Q.front(); Q.pop();

        loop(i, SZ(graph[u]))
        {
            v = graph[u][i];
            if(v != not_to_visit)
            {
                if(!visited[v])
                {
                    visited[v] = 1;
                    totalVisited++;
                    Q.push(v);
                }
            }
        }
    }

    return totalVisited != (cntPlaces - 1);
}




int main()
{
    string str;
    stringstream ss;
    int p, q;
    int result;
    while(1)
    {
        getint(cntPlaces);
        if(cntPlaces == 0) break;

        cin.ignore();

        loop(i, cntPlaces)  graph[i].clear();

        while(1)
        {
            getline(cin, str);
            if(str == "0") break;


            ss.clear();
            ss<<str;

            ss>>p;
            p--;

            while(ss.good())
            {
                ss>>q;
                q--;
                graph[p].pb(q);
                graph[q].pb(p);
            }
        }

        if(cntPlaces == 1)
        {
            pf("0\n");
            continue;
        }

        result = 0;

        loop(i, cntPlaces)
        {
            if(bfs(i))
            {
                result++;
            }
        }

        pf("%d\n", result);




    }

    return 0;
}


(UVa) 10600 – ACM Contest and Blackout

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1541
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second


#define FEM edges[i].sc.fr
#define SEM edges[i].sc.sc

using namespace std;

#define MAXX 102
int N, M;
vector<pair<int, paii> > edges;
vector<int>graph[MAXX];

int best, secondBest;
bool secondBestDone;
int parent[MAXX];
int cost[MAXX][MAXX];
int dir[MAXX];

int find(int u)
{
    if(parent[u] == u) return u;
    return parent[u] = find(parent[u]);
}


void bfs(int source, int target)
{
    bool visited[MAXX];

    mem(visited, false);

    visited = 1;
    queue<int>Q;
    Q.push(source);

    while(!Q.empty())
    {
        int u = Q.front(); Q.pop();
        loop(i, SZ(graph[u]))
        {
            int v = graph[u][i];
            if(!visited[v])
            {
                visited[v] = 1;
                dir[v] = u;
                if(target == v)
                {
                    return;
                }
                Q.push(v);
            }
        }
    }
}


int cleanAndAdd(int source, int destination)
{
    int maxValue = -INF;
    while(source != destination)
    {
        //cout<<"visiting " << cost[dir]<<" cost"<<endl;
        maxValue = max(maxValue, cost[dir] );
        source = dir;
    }
    //cout<<"maxValue " <<maxValue<<endl;
    return maxValue;
}


void MST()
{
    best = 0;
    secondBestDone = false;
    secondBest = INF;


    int p, q;

    loop(i, SZ(edges))
    {
        p = find(FEM);
        q = find(SEM);

        if(p != q)
        {
            graph[ FEM ].pb(SEM);
            graph[ SEM ].pb(FEM);
            cost[SEM][FEM] = cost[FEM][SEM] = edges[i].fr;

            parent[p] = q;
            best += edges[i].fr;
        }
        else
        {
            if(!secondBestDone)
            {
                bfs(FEM, SEM);
                secondBest = min(secondBest, - cleanAndAdd(SEM, FEM) + edges[i].fr );
                if(secondBest == 0)
                    secondBestDone = 1;
            }
        }
    }

}




int main()
{
    //read();
    int p, q, w;
    int kases;
    getint(kases);

    while(kases--)
    {
        getint(N); getint(M);
        edges.clear();
        loop(i, M)
        {
            getint(p); getint(q); getint(w);
            edges.pb(mp(w, mp(p, q)));
        }
        sort(all(edges));
        for(int i=1; i<=N; i++) parent[i] = i, graph[i].clear();

        MST();
        secondBest += best;
        cout<<best<<" "<<secondBest<<endl;


    }

    return 0;
}