记录编号 |
259841 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016]奖学金 |
最终得分 |
100 |
用户昵称 |
洛克索耶夫 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.060 s |
提交时间 |
2016-05-11 18:06:33 |
内存使用 |
0.58 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int Read()
{
int a=0,minus=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') minus=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
a=a*10+ch-'0';
ch=getchar();
}
return a*minus;
}
struct EDGE{
int from;
int to;
int next;
EDGE()
{
from=to=next=0;
}
}edges[20010];
struct Node{
int money;
int in;
Node()
{
money=100;in=0;
}
}nodes[10010];
int GetMax(int a, int b)
{
return a >b ? a : b;
}
int head[10010] = {0}, len = 0;
queue <int> Q;
//假设nodes,money=100,du
void BFS(){
while(!Q.empty()){
int t = Q.front();Q.pop();
for(int i=head[t];i!=-1;i = edges[i].next){
if( nodes[ edges[i].to ].money < nodes[t].money + 1 )
nodes[ edges[i].to ].money = nodes[t].money + 1;
nodes[edges[i].to].in--;
if( nodes[ edges[i].to ].in == 0 )
Q.push(edges[i].to);
}
}
}
void AddEdge(int from, int to)
{
len++;
edges[len].from = from;
edges[len].to = to;
edges[len].next = head[from];
head[from] = len;
nodes[to].in++;
}
int main()
{
freopen("reward.in","r",stdin);
freopen("reward.out","w",stdout);
memset(head, -1, sizeof(head));
int n=Read(),m=Read();
for(int i=1;i<=m;i++){
int from=Read();
int to=Read();
AddEdge(to,from);
}
for(int i=1;i<=n;i++){
if(nodes[i].in==0)
Q.push(i);//DFS(i);
//入度为0,说明该同学奖学金最少
}
BFS();
for(int i=1;i<=n;i++){
if( nodes[i].in != 0 ){
printf("impossible");
return 0;
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=nodes[i].money;
}
printf("%d",ans);
fclose(stdin);
fclose(stdout);
return 0;
}