topsort是用邻接表来存储图,然后利用队列存所有入度为0的点, 返回是否等于n-1个点的true还是false; 注意:
memset(h, -1, sizeof h);
一定是在主函数输入之前, 不是输入之后, 要不然会超时的, 老是犯这个错误(本人)
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int d[N];
int idx, ne[N], e[N],h[N];
int q[N];
int n ,m;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
bool topsort()
{
int hh = 0 , tt = -1;
for(int i = 1; i <= n ; i ++)
{
if(d[i]==0)
{
q[++tt] = i;
}
}
while(hh <= tt)
{
int t = q[hh++];
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
d[j]--;
if(d[j]==0)
{
q[++tt] = j;
}
}
}
return tt== n-1;
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
while (m -- )
{
int a,b;
cin >> a >> b;
add(a, b);
d[b]++;
}
if(topsort())
{
for(int i = 0 ; i < n ; i ++)
{
cout << q[i] << " " ;
}
}
else
cout << -1 << endl;
return 0;
}
- 还是要按照上课的思路,一步步删除指向的结点, 看最终是否有环, 怎么判断是否有环?
就是删到最后, 就只剩下一个结点: - 还有就是利用邻接表来查指向的边;注意入度在存图的时候已经存了;我们找到一个边删除一条边;
- 对列存的是所有入度为0的点
解决的问题有那些
比如选课的先修课, 看是否能全部学完;
|