【模板】拓扑排序
之前写题要用板子的时候去挖坟
【图论】拓扑排序&判环
发现我居然没有存板子
就完善一下吧 把代码搞出来 顺便复习一下
void tp()
{
for(int i=1;i<=n;i++)
if(ind[i]==0)
Q.push(i);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
ans[++cnt]=u;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
ind[v]--;
if(ind[v]==0)
Q.push(v);
}
}
}
然后再把 c n t cnt cnt和顶点数 n n n进行比较 如果 c n t < n cnt<n cnt<n就说明有环
但是呢 要注意有时候图不是一个联通块的情况
搞了一道小水题
http://codevs.cn/problem/2833/
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 10005
#define LL long long
int n,m,ind[MAXN],cnt;
vector<int>G[MAXN];
queue<int>Q;
void tp()
{
for(int i=1;i<=n;i++)
if(ind[i]==0)
Q.push(i);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
cnt++;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
ind[v]--;
if(ind[v]==0)
Q.push(v);
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d %d",&u,&v);
G[u].push_back(v);
ind[v]++;
}
tp();
if(cnt>=n)
printf("o(∩_∩)o");
else
printf("T_T\n%d\n",n-cnt);
return 0;
}
转载请注明出处,有疑问欢迎探讨
博主邮箱 2775182058@qq.com