死循环求助

B3644 【模板】拓扑排序 / 家谱树

1.边建反了(你判的是出度,要反建)。 2.要给已经被删的点打标记,不能再删。
by Mugino_Shizuri @ 2024-07-08 21:03:23


@[majingtong](/user/502981)
by Mugino_Shizuri @ 2024-07-08 21:05:40


AC code ```cpp #include<bits/stdc++.h> using namespace std; int flag[110]; queue < int > Q; class Graph { public: int V;//顶点数 vector<list <int > >adj;//邻接表 //构造函数,初始化图的顶点数和邻接表 Graph(int V) { this->V=V; adj.resize(V);//根据顶点数调整邻接表的大小 } //添加边的方法,无向图需要在两个顶点的邻接表中都添加对方 void addEdge(int v,int w) { adj[v].push_back(w);//在顶点v的邻接表中添加顶点w } //删除节点的方法,同时删除与该节点相关的所有边 void removeNode(int v) { if(v<0||v>=V) {//检查节点索引是否有效 cout<<"Invalid node index"<<endl;//输出错误信息 return;//返回,不执行后续操作 } //遍历所有顶点,删除与顶点v相关的边 for(int i=0;i<V;i++) adj[i].remove(v); flag[v]=1;Q.push(v); //删除顶点v本身的所有边 adj[v].clear();//清空顶点v的邻接表 } int findInDegree(int x) { int result=100;//存储结果 for(int i=0;i<V;i++) if(!flag[i]&&adj[i].size()==x)result=i;//如果节点i的入度等于x,将节点i添加到结果中 return result;//返回结果 } bool isEmpty() { for(int i=0;i<V;i++) { if(!adj[i].empty())//如果存在非空的邻接表 return false;//图不为空 if(!flag[i]) return false; } return true;//所有邻接表都为空,图为空 } }; int main() { int n; cin>>n; Graph g(n); for(int i=0;i<=n-1;i++) { int tmp; do { cin>>tmp; if(tmp!=0)g.addEdge(tmp-1,i); }while(tmp!=0); } while(!g.isEmpty()) g.removeNode(g.findInDegree(0)); while(!Q.empty()){ int x=Q.front(); Q.pop(); cout<<x+1<<' '; } return 0; // Graph g(3); // g.addEdge(0,1); // g.addEdge(1,2); // g.removeNode(2); // cout<<g.findInDegree(0)+1; } ```
by Mugino_Shizuri @ 2024-07-08 21:09:04


Q 用来存储答案
by Mugino_Shizuri @ 2024-07-08 21:09:29


@[Mugino_Shizuri](/user/576467) 太感谢了 已经切了1周了
by majingtong @ 2024-07-10 19:41:44


|