#include<bits/stdc++.h>
using namespace std;
int n,m,visit[10005],num[10005],topo[10005];
vector<int>map1[10005];
int dfs(int u)
{
visit[u]=-1;
int max1=0;
for(int i=0;i<map1[u].size();i++)
{
int v=map1[u][i];
if(visit[v]==-1) return -1;
else if(!visit[v])
{
int x=dfs(v);
if(x==-1)
return -1;
else
{
max1=max(max1,x+1);
}
}
}
visit[u]=0;
if(topo[u]==0)
{
num[u]=888;
return 888;
}
else
{
num[u]=max1;
return max1;
}
}
bool toposort()
{
for(int i=1;i<=n;i++)
{
if(!visit[i])
{
if(dfs(i)==-1)
return false;
}
}
return true;
}
int main()
{
int x,y;
while(cin>>n>>m)
{
memset(visit,0,sizeof(visit));
memset(num,0,sizeof(num));
memset(topo,0,sizeof(topo));
for(int i=1;i<=m;i++)
{
cin>>x>>y;
map1[x].push_back(y);
topo[x]++;
}
if(toposort())
{
int sum=0;
for(int i=1;i<=n;i++)
sum+=num[i];
cout<<sum<<endl;
}
else
{
cout<<-1<<endl;
}
for(int i=1;i<=n;i++)
map1[i].clear();
}
return 0;
}
HDU 2647 Reward(拓扑排序)
最新推荐文章于 2023-05-02 11:11:33 发布
本文介绍了一种基于深度优先搜索(DFS)的图的拓扑排序算法实现,并通过一个具体的C++代码示例展示了如何处理有向无环图(DAG),包括节点的访问标记、递归遍历及返回最长路径长度等关键步骤。

1519

被折叠的 条评论
为什么被折叠?



