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