classSolution{public:
vector<int>findMinHeightTrees(int n, vector<vector<int>>& edges){//拓扑排序变形//构建入度表//构建邻接表//入度为1的节点依次进入Queue,但只剩下两个或者一个节点时返回if(n==1)return{0};//入度表
vector<int>indegree(n);//邻接表
vector<vector<int>> m;
m.resize(n);//结果
vector<int> res;for(auto p:edges){//无向边
int u=p[0];
int v=p[1];//入度表更新
indegree[u]++;
indegree[v]++;//邻接表更新
m[u].push_back(v);
m[v].push_back(u);}//定义一个队列
queue<int>Q;//将度为1的节点全部进队列for(int i=0;i<n;i++){if(indegree[i]==1){Q.push(i);}}
int num=n;//依次删除节点 直至只剩下1个或者2个while(num>2){
int sz =Q.size();for(int i=0;i<sz;i++){
int pre =Q.front();Q.pop();
num--;
indegree[pre]--;for(auto cur:m[pre]){
indegree[cur]--;if(indegree[cur]==1){Q.push(cur);}}}}while(!Q.empty()){
res.push_back(Q.front());Q.pop();}return res;}};
最短路径
1.广度优先搜索(无权重)
伪代码
//Pusedocodevoid Graph::unweight(Vertex s)//输入初始顶点{//利用队列实现广度优先搜索
Queue<Vertex> q;for each Vertex v
v.dist =INFINITY//初始化节点可到达的距离为无穷(不可达)
s.dist=0;//初始化为0
q.enqueue(s);while(!q.isEmpty())//依次操作{
Vertex v = q.dequeue();//出队列//邻接节点的信息for each Vertex w adjacent to v
if(w.dist ==INFINITY)//如果不可达则更新{
w.dist = v,dist+1;
w.path=v;//w的上一个节点为v
q.enqueue(w);//入队列}}}
2. Dijkstra算法
伪代码
PSEUDOCODE
struct Vertex
{
List adj;//邻接表
bool known;//是否访问过
DistType dist;//路径长度
Vertex path;//上一个节点}void Graph::dijkstra(Vertex s){//使用贪心算法//初始化节点for each Vertex v
{
v.dist =INTINITY;
v.known.false;}
s.dist=0;for(;;){
Vertex v = smallest unknown distance vertex; 不知道距离的节点的最小值
if(v==NOT_A_VERTEX)//不是边停止break;
v.known=true;//标记为已经访问过for each Vertex w adjacent to v
if(!w.known){if(v.dist+cvw<w.dist){//Update wdecreace(w.dist to v.dist+cvw)
w.path = v;}}}}