2015年1月31日 星期六

[UVA] 11936 - The Lazy Lumberjacks

/*20150131 hanting*/
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int edge[3];
        cin>>edge[0]>>edge[1]>>edge[2];
        sort(edge,edge+3);
        cout<<(edge[0]+edge[1]>edge[2] ? "OK":"Wrong!!")<<endl;
    }
    return 0;
}

2015年1月30日 星期五

[UVA] 610 - Street Directions

/*20150131 hanting*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool Find(vector<int> &vec,int i)
{
    vector<int>::iterator it=find(vec.begin(),vec.end(),i);
    return (it!=vec.end());
}
int DFS(int *visit,vector<int> *node,int vertex,int parent,vector<int> *store)
{
    static int time=0;
    int mini=time;
    visit[vertex]=time++;
    for(int i=0;i<node[vertex].size();i++)
    {
        int temp=mini;
        if(visit[ node[vertex][i] ]==-1)
        {
            store[vertex].push_back(node[vertex][i]);//路徑儲存
            temp=DFS(visit,node,node[vertex][i],vertex,store);
            if(temp>visit[vertex])//找橋
            {
                store[ node[vertex][i] ].push_back(vertex);
            }
        }
        else if(node[vertex][i]!=parent)//其他路徑//backedge
        {//若已存1 3 不必存3 1
            if(!Find(store[ node[vertex][i] ],vertex))store[vertex].push_back(node[vertex][i]);
            temp=visit[  node[vertex][i] ];
        }
        if(temp<mini) mini=temp;

    }
    return mini;//由backedge能回溯的最小visit
}
int main()
{
    int nodeNum,connectNum;
    int Times=0;
    while(cin>>nodeNum>>connectNum && nodeNum+connectNum)
    {
        cout<<++Times<<endl<<endl;
        vector<int> node[nodeNum+1];
        for(int i=0;i<connectNum;i++)
        {
            int a,b;
            cin>>a>>b;
            node[a].push_back(b);
            node[b].push_back(a);
        }

        int visit[nodeNum+1];
        vector<int> store[nodeNum+1];
        fill(visit,visit+nodeNum+1,-1);
        for(int i=1;i<=nodeNum;i++)
        {
            if(visit[i]==-1)
            {
                DFS(visit,node,i,-1,store);
            }
        }
        for(int i=1;i<=nodeNum;i++)
        {
            sort(store[i].begin(),store[i].end());
            for(int j=0;j<store[i].size();j++)
            {
                cout<<i<<" "<<store[i][j]<<endl;
            }
        }
        cout<<"#"<<endl;
    }
    return 0;
}

[UVA] 796 - Critical Links

/*20150131 hanting*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int DFS(vector<int> *vertex,int node,int parent,int *visit,vector<int> *store)
{
    static int Count=0;
    int mini=Count;
    visit[node]=Count++;
    for(int i=0;i<vertex[node].size();i++)
    {
        int temp=mini;
        if(visit[ vertex[node][i] ]==-1)/*子節點 沒拜訪過的*/
        {
            temp=DFS(vertex,vertex[node][i],node,visit,store);
            if(temp>visit[node])/*橋*/
            {
                int x=node;
                int y=vertex[node][i];
                if(x>y) swap(x,y);
                store[x].push_back(y);
            }
        }
        else if(vertex[node][i]!=parent)/*拜訪過 判斷回溯*/
        {
            temp=visit[ vertex[node][i] ];
        }
        if(mini>temp) mini=temp;
    }
    return mini;
}

int main()
{
    int N;
    while(cin>>N)
    {
        vector<int> vertex[N];
        vector<int> store[N];
        int visit[N];
        fill(visit,visit+N,-1);
        for(int i=0;i<N;i++)
        {
            int server,connectNum,connect;
            char c;
            cin>>server>>c>>connectNum>>c;
            for(int j=0;j<connectNum;j++)
            {
                cin>>connect;
                vertex[server].push_back(connect);
            }
        }
        for(int i=0;i<N;i++)
        {
            if(visit[i]==-1)
            {
                DFS(vertex,i,-1,visit,store);
            }
        }
        int count=0;
        for(int i=0;i<N;i++)
        {
            count+=store[i].size();
        }
        cout<<count<<" critical links"<<endl;
        for(int i=0;i<N;i++)
        {
            sort(store[i].begin(),store[i].end());
            for(int j=0;j<store[i].size();j++)
            {
                cout<<i<<" - "<<store[i][j]<<endl;
            }
        }
        cout<<endl;
    }
    return 0;
}