//在做的时候,邻接表构造错了,导致出现死循环问题tle。。。还有就是topo里面sum写在了if外,,,,导致计数错误WA
//dfs已解出
#include<iostream>
#include<cstdio>
#include <string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 20000+5;
struct Edge{
int to;
int next;
}e[N];
int vis[N];
int price[N];
int dgree[N];
int head[N];
int sum;
int n, m;
//构造邻接表
void add(int x, int y, int i)
{
e[i].to = x;//逆向
e[i].next = head[y];
head[y] = i;
}
void dfs(int i)
{
for(int j=head[i]; j != -1; j=e[j].next){
int v = e[j].to;
dgree[v]--;
price[v] = max(price[v], price[i]+1);//每次都会更新,有一种可能就是之前存储的比现在多,就不用更新了....
if(dgree[v] == 0 && vis[v] == 0){
vis[v] = 1;
sum++;
dfs(v);
}
}
return;
}
void toposort()
{
sum = 0;
queue<int> q;
for(int i=1; i<=n; i++){
if(dgree[i] == 0){
q.push(i);
vis[i] = 1;
sum ++;
}
}
while(!q.empty()){
int i = q.front();
q.pop();
for(int j=head[i]; j != -1; j=e[j].next){
int v = e[j].to;
dgree[v]--;
price[v] = price[i]+1;
if(dgree[v] == 0 && vis[v] == 0){
q.push(v);
vis[v] = 1;
sum++;
}
}
}
}
int main()
{
while(~scanf("%d%d", &n, &m)){
sum = 0;//为dfs做准备
memset(price, 0, sizeof(price));
memset(vis, 0, sizeof(vis));
memset(dgree, 0, sizeof(dgree));
memset(head, -1, sizeof(head));
for(int i=1; i<=m; i++){
int a, b;
scanf("%d%d", &a, &b);
// cin >> a >> b;
add(a, b, i);
dgree[a]++;
}
for(int i=1; i<=n; i++){
if(dgree[i] == 0 && vis[i] == 0){
sum++;
vis[i] = 1;
dfs(i);
}
}
// toposort();
// cout << sum << endl;
if(sum == n){
sum = n*888;
for(int i=1; i<=n; i++){
sum += price[i];
}
printf("%d\n", sum);
// cout << sum << endl;
}
else printf("-1\n");
}
return 0;
}
//ps:以下问题已解决。。。。详见上图第一个代码
//个人感觉可以用dfs解下,但是目前一直WA,待解决....
#include<iostream>
#include<cstdio>
#include <string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 20000+5;
struct Edge{
int to;
int next;
}e[N];
int vis[N];
int price[N];
int dgree[N];
int head[N];
int sum;
int n, m;
//构造邻接表
void add(int x, int y, int i)
{
e[i].to = x;//逆向
e[i].next = head[y];
head[y] = i;
}
void dfs(int i)
{
for(int j=head[i]; j != -1; j=e[j].next){
int v = e[j].to;
dgree[v]--;
price[v] = price[i]+1;
if(dgree[v] == 0 && vis[v] == 0){
vis[v] = 1;
sum++;
dfs(v);
}
}
}
void toposort()
{
sum = 0;
queue<int> q;
for(int i=1; i<=n; i++){
if(dgree[i] == 0){
q.push(i);
vis[i] = 1;
sum ++;
}
}
while(!q.empty()){
int i = q.front();
q.pop();
for(int j=head[i]; j != -1; j=e[j].next){
int v = e[j].to;
dgree[v]--;
price[v] = price[i]+1;
if(dgree[v] == 0 && vis[v] == 0){
q.push(v);
vis[v] = 1;
sum++;
}
}
}
}
int main()
{
while(~scanf("%d%d", &n, &m)){
sum = 1;//为dfs做准备
memset(price, 0, sizeof(price));
memset(vis, 0, sizeof(vis));
memset(dgree, 0, sizeof(dgree));
memset(head, -1, sizeof(head));
for(int i=1; i<=m; i++){
int a, b;
scanf("%d%d", &a, &b);
// cin >> a >> b;
add(a, b, i);
dgree[a]++;
}
for(int i=1; i<=n; i++){
if(dgree[i] == 0){
vis[i] = 0;
dfs(i);
}
}
// toposort();
// cout << sum << endl;
if(sum == n){
sum = n*888;
for(int i=1; i<=n; i++){
sum += price[i];
}
printf("%d\n", sum);
// cout << sum << endl;
}
else printf("-1\n");
}
return 0;
}