您的位置:首页 > 其它

HDU 2647 Reward(拓扑排序)

2016-11-15 13:32 363 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: