和之前那道题一毛一样
class Solution {
public:
class Node;
class Edge;
class Node
{
public:
int indegree;
int outdegree;
int name;
list<Node*>nextNode;
list<Edge*>nextEdge;
Node(int _name):indegree(0), outdegree(0), name(_name){};
};
class Edge
{
public:
Node* from;
Node* to;
int weight;
Edge(Node* _from, Node* _to):from(_from), to(_to), weight(0){};
};
class Graph
{
public:
unordered_map<int, Node*>node;
list<Edge*>edge;
Graph(vector<vector<int> >a)
{
for(auto vec_tmp : a)
{
int fromName = vec_tmp[1], toName = vec_tmp[0];
if(node.end() == node.find(fromName))
node.insert(pair<int, Node*>(fromName, new Node(fromName)));
if(node.end() == node.find(toName))
node.insert(pair<int, Node*>(toName, new Node(toName)));
auto pfromNode = node.find(fromName)->second, ptoNode = node.find(toName)->second;
auto pedge = new Edge(pfromNode, ptoNode);
++pfromNode->outdegree;
++ptoNode->indegree;
pfromNode->nextNode.push_back(ptoNode);
pfromNode->nextEdge.push_back(pedge);
edge.push_back(pedge);
}
}
~Graph()
{
for(auto nodetmp : node)
delete(nodetmp.second);
for(auto edgetmp : edge)
delete(edgetmp);
}
};
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int>ret;
queue<Node*>queueNoIndegree;
Graph graph(prerequisites);
unordered_set<int>usedNode;
for(auto itNode : graph.node)
{
if(0 == itNode.second->indegree)
queueNoIndegree.push(itNode.second);
usedNode.insert(itNode.first);
}
while(!queueNoIndegree.empty())
{
auto pnode = queueNoIndegree.front();
for(auto pnextNode : pnode->nextNode)
if(--pnextNode->indegree == 0)
queueNoIndegree.push(pnextNode);
graph.node.erase(pnode->name);
ret.push_back(pnode->name);
delete(pnode);
queueNoIndegree.pop();
}
if(!graph.node.empty())
{
vector<int>replace;
swap(ret, replace);
}
else
{
for(int i=0; i<numCourses; ++i)
{
if(usedNode.end()==usedNode.find(i))
ret.push_back(i);
}
}
return ret;
}
};