标签:des color io os ar for sp div art
#include <stdio.h>#include <string>#include <iostream>#include <vector>#include <unordered_map>#include <queue>using namespace std;class Node{public:    string name;    vector<Node*> adj;    bool visited;    int groupId;    Node(string str):name(str), visited(false), groupId(-1){}    int getNeighborCount() {        return adj.size();    }};class Graph{public:    unordered_map<string, Node*> hashNode;    vector<Node*> nodes;    void createNode(string str)    {        Node* n = new Node(str);        nodes.push_back(n);        hashNode[str] = n;    }    bool isExist(string str)    {        if(hashNode.count(str)>0) return true;        else return false;    }    void addEdge(string str1, string str2)    {        if(!isExist(str1)) createNode(str1);        if(!isExist(str2)) createNode(str2);        hashNode[str1]->adj.push_back( hashNode[str2] );        hashNode[str2]->adj.push_back( hashNode[str1] );    }    bool isBipartite()    {        for(int i=0; i<nodes.size(); i++)        {            if(!nodes[i]->visited)            {                bool f = bfs(nodes[i]);                if(!f) return false;            }        }        return true;    }         bool bfs(Node* n)    {        n->groupId = 1;        queue<Node*> q;        q.push(n);        while(!q.empty())        {            n = q.front(); q.pop();            n->visited = true;            for(int i=0; i<n->getNeighborCount(); i++)            {                if(!n->adj[i]->visited)                {                    n->adj[i]->groupId = 3 - n->groupId;                    q.push(n->adj[i]);                }                else                {                    if(n->adj[i]->groupId == n->groupId)                        return false;                }            }        }        return true;    }    ~Graph()    {        for(int i=0; i<nodes.size(); i++)        {            delete nodes[i];        }    }};int main(){    freopen("gcj_bad_horse_small-practice-2.in", "r", stdin);    freopen("output.out", "w", stdout);    int input_count;    cin >> input_count;    int counter = 1;    while(input_count)    {        //do work        int M;        cin >> M;        Graph g;        for(int i=0; i<M; i++)        {            string str1, str2;            cin >> str1 >> str2;            g.addEdge(str1, str2);        }                 cout << "Case #" << counter++ << ": " << (g.isBipartite()?"Yes":"No") << "\n";        //finish work        input_count--;    }    return 0;}标签:des color io os ar for sp div art
原文地址:http://www.cnblogs.com/bianzeming/p/4009911.html