标签:
Description
Input
Output
Sample Input
2 1 1 2 2 2 1 2 2 1
Sample Output
1777 -1
关键是要反向建图 然后用一个数组去记录一下每个点的层次
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w",stdout);
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
const int MAXN=1e5+5;
struct Edge{
int v,nxt;
}E[MAXN*2];
int Head[MAXN],erear;
int IN[MAXN],P[MAXN];
int n,m,sz;
int dis[MAXN]; //记录层次
void edge_init(){
erear=0;
memset(Head,-1,sizeof(Head));
memset(IN,0,sizeof(IN));
memset(dis,0,sizeof(dis));
}
void edge_add(int u,int v){
E[erear].v=v;
E[erear].nxt=Head[u];
Head[u]=erear++;
}
int main()
{
//FIN
while(~scanf("%d%d",&n,&m))
{
edge_init();
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
edge_add(v,u); //反向建图
IN[u]++;
}
sz=0;
queue<int>Q;
for(int i=1;i<=n;i++){
if(!IN[i]){
Q.push(i);
dis[i]=0;
}
}
bool sign=0;
while(!Q.empty()){
if(Q.size()>=2) sign++;
int u=Q.front();
Q.pop();
P[sz++]=u;
for(int i=Head[u];~i;i=E[i].nxt){
int v=E[i].v;
dis[v]=dis[v]>(dis[u]+1)?dis[v]:(dis[u]+1);
IN[v]--;
if(!IN[v]) Q.push(v);
}
}
if(sz!=n){
printf("-1\n");
continue;
}
int ans=0;
for(int i=1;i<=sz;i++){
ans+=dis[i];
}
ans+=sz*888;
printf("%d\n",ans);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/Hyouka/p/5743171.html