hdu2647
程序员文章站
2022-03-22 19:13:50
...
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
int res[maxn],in[maxn];
vector<int> g[maxn];
int topsort(int n){
queue<int> q;
for(int i=1;i<=n;i++)
if(in[i]==0) q.push(i);
int c=0;//标记总操作的结点数,判断是否有环
while(!q.empty()){
int x=q.front();
q.pop();
c++;
for(int i=0;i<g[x].size();i++){
in[g[x][i]]--;
if(in[g[x][i]]==0){
q.push(g[x][i]);
res[g[x][i]]=max(res[g[x][i]],res[x]+1);
}
}
}
if(c!=n) return -1;//没有全部操作,说明有环
int s=0;
for(int i=1;i<=n;i++){
s+=res[i]+888;
}
return s;
}
int main()
{
int n,m;
int j;
while(cin>>n>>m){
memset(in,0,sizeof(in));
memset(g,0,sizeof(g));
memset(res,0,sizeof(res));
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
g[b].push_back(a);//反向建图
in[a]++;//a入度+1
}
cout<<topsort(n)<<endl;
}
return 0;
}
上一篇: 【递归】全排列的三种形式代码对比
下一篇: javascript有哪几部分组成
推荐阅读