1.拓扑排序
拓扑排序中,每次取的结点为没有入度的点(没有前驱)
//判断是否存在拓扑排序;prerequisites为边;[1,0]代表1必须在0前面完成
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> edge(numCourses);
int indegree[numCourses];
for(auto &i:indegree) i=0;
for(auto v:prerequisites){
edge[v[0]].push_back(v[1]);//存放图
indegree[v[1]]++;//计算入度
}
bool flag=true;
while(flag){
flag=false;
for(int i=0;i<numCourses;i++){
if(indegree[i]==0&&edge[i].size()!=0){
for(auto y:edge[i])
indegree[y]--;//减去入度
edge[i].clear();//删除边
flag=true;
break;
}
}
}
for(auto e:edge)
if(e.size()!=0) return false;//若还存在无法删去的边
return true;
}
若要输出拓扑排序,if(indegree[i]==0&&edge[i].size()!=0) 中判断是否有边应该改成该结点是否已输出,否则会丢失结点。
2.new
关键字new:获得内存-调用构造函数-返回指针
//正确
l->next=new ListNode(0);
//错误
ListNode temp = new ListNode(0);
l->next=&temp;
3.字符数组转字符串
char a[5];
//
//a赋值
//
string result(begin(a),end(a));
string result(&a[0],&a[5]);//转换a[0]~a[4]
4.stack
std::stack
stack<int> s;
//压栈
s.push(1);
//栈顶元素
s.top();
//出栈
s.pop();