#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
#include<queue>
#define maxn 10001+50
using namespace std;
int n;
int c[maxn],dis[maxn];
vector<int> g[maxn];
vector<int> gg[maxn];
queue<int> q;
bool dfs(int u){
c[u]=-1;
int sz=g[u].size();
for(int i=0;i<sz;i++){
if(c[g[u][i]]<0) return false;
else if(!c[g[u][i]] && !dfs(g[u][i]))
return false;
}
c[u]=1;
return true;
}
bool toposort(){
for(int i=1;i<=n;i++)
c[i]=0;
for(int u=1;u<=n;u++) if(!c[u])
if(!dfs(u)) return false;
return true;
}
void bfs(int u){
while(!q.empty()) q.pop();
q.push(u);
while(!q.empty()){
int u=q.front();
q.pop();
int sz=gg[u].size();
for(int i=0;i<sz;i++){
int v=gg[u][i];
if(dis[u]<dis[v]) continue;
else{
dis[v]=dis[u]+1;
q.push(v);
}
}
}
}
int solve(){
int s=0;
for(int i=1;i<=n;i++)
dis[i]=888;
for(int i=1;i<=n;i++){
bfs(i);
}
for(int i=1;i<=n;i++)
s+=dis[i];
return s;
}
int main()
{
int m,u,v;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++) g[i].clear(),gg[i].clear();
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
gg[v].push_back(u);
}
if(toposort()){
printf("%d\n",solve());
}
else
printf("-1\n");
}
return 0;
}
hdu 2647 bfs+拓扑排序
最新推荐文章于 2018-10-09 12:22:30 发布