#include <stdio.h>
#define oo 1000005
#define MAX_N 100
#define NO_EDGE 0
typedef struct{
int n;
int A[MAX_N][MAX_N];
}Graph;
void init_graph(Graph *G, int n){
G->n = n;
int u,v;
for(u=1;u<=n;u++){
for(v=1;v<=n;v++){
G->A[u][v] = 0;
}
}
}
void add_edge(Graph *G, int u, int v){
G->A[u][v]++;
}
#define MAX_ELEMENTS 100
typedef int ElementType;
typedef int ElementType;
typedef struct{
ElementType data[MAX_ELEMENTS];
int size;
}List;
void make_null(List *L){
L->size = 0;
}
void push_back(List *L, ElementType x){
L->data[L->size] = x;
L->size++;
}
ElementType element_at(List *L, int i){
return L->data[i-1];
}
int count_list(List *L){
return L->size;
}
void copy_list(List *L1,List *L2){
L2->size = L1->size;
int i;
for(i=0;i< L1->size;i++){
L2->data[i] = L1->data[i];
}
}
#define MAX_SIZE 100
typedef int ElementType;
typedef struct{
ElementType data[MAX_SIZE];
int front, rear;
}Queue;
void make_null_queue(Queue *Q){
Q->front = -1;
Q->rear = -1;
}
void enqueue(Queue *Q, ElementType u){
Q->rear++;
Q->data[Q->rear]=u;
}
ElementType front(Queue *Q){
return Q->data[Q->front];
}
void dequeue(Queue *Q){
Q->front++;
}
int empty(Queue *Q){
return Q->front > Q->rear;
}
int max(int a, int b){
return (a>b)?a:b;
}
int min(int a, int b){
return (a<b)?a:b;
}
void topo_sort(Graph *G, List *L){
int deg[MAX_N];
int u,x,v;
//Tinh bac vao cua u
for(u=1; u<=G->n;u++){
deg[u] = 0;
for(x=1;x<=G->n;x++){
if(G->A[x][u] != 0)
deg[u]++;
}
}
Queue Q;
make_null_queue(&Q);
for(u=1;u<=G->n;u++){
if(deg[u]==0)
enqueue(&Q,u);
}
make_null(L);
while(!empty(&Q)){
int u = front(&Q);
dequeue(&Q);
push_back(L,u);
for(v=1;v<=G->n;v++){
if(G->A[u][v] != 0){
deg[v]--;
if(deg[v]==0)
enqueue(&Q,v);
}
}
}
}
int d[MAX_N];
int r[MAX_N];
int main(){
Graph G;
int n,u,x,v,j;
// freopen("dt.txt", "r", stdin);
init_graph(&G, n+2);
int alpha = n+1, beta = n+2;
d[alpha] = 0;
for(u=1;u<=n;u++){
do{
if(x>0) add_edge(&G, x, u);
}while(x>0);
}
for(u=1;u<=n;u++){
int deg_neg = 0;
for(x=1;x<=n;x++){
if(G.A[x][u] > 0) deg_neg++;
}
if(deg_neg == 0) add_edge(&G, alpha, u);
}
for(u=1;u<=n;u++){
int deg_pos = 0;
for(v=1;v<=n;v++){
if(G.A[u][v] > 0) deg_pos++;
}
if(deg_pos==0) add_edge(&G, u, beta);
}
List L;
topo_sort(&G, &L);
int t[MAX_N];
t[alpha] = 0;
for(j=2;j<=L.size;j++){
int u = element_at(&L, j);
t[u] = 0;
for(x=1;x<=G.n;x++){
if(G.A[x][u] > 0)
t[u] = max(t[u], t[x] + d[x]);
}
}
int T[MAX_N];
T[beta] = t[beta];
for(j=L.size-1;j>=1;j--){
int u = element_at(&L, j);
T[u] = +oo;
for(v=1;v<=G.n;v++){
if(G.A[u][v] > 0)
T[u] = min(T[u], T[v] - d[u]);
}
}
for(u=1;u<=G.n;u++){
printf("%d-%d\n", t
[u
], T
[u
]); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNkZWZpbmUgb28gMTAwMDAwNQojZGVmaW5lIE1BWF9OIDEwMAojZGVmaW5lIE5PX0VER0UgMAp0eXBlZGVmIHN0cnVjdHsKCWludCBuOwoJaW50IEFbTUFYX05dW01BWF9OXTsKfUdyYXBoOwp2b2lkIGluaXRfZ3JhcGgoR3JhcGggKkcsIGludCBuKXsKCUctPm4gPSBuOwoJaW50IHUsdjsKCWZvcih1PTE7dTw9bjt1KyspewoJCWZvcih2PTE7djw9bjt2KyspewoJCQlHLT5BW3VdW3ZdID0gMDsKCQl9Cgl9Cn0Kdm9pZCBhZGRfZWRnZShHcmFwaCAqRywgaW50IHUsIGludCB2KXsKCUctPkFbdV1bdl0rKzsKfQoKI2RlZmluZSBNQVhfRUxFTUVOVFMgMTAwCnR5cGVkZWYgaW50IEVsZW1lbnRUeXBlOwp0eXBlZGVmIGludCBFbGVtZW50VHlwZTsKdHlwZWRlZiBzdHJ1Y3R7CglFbGVtZW50VHlwZSBkYXRhW01BWF9FTEVNRU5UU107CglpbnQgc2l6ZTsKfUxpc3Q7Cgp2b2lkIG1ha2VfbnVsbChMaXN0ICpMKXsKCUwtPnNpemUgPSAwOwp9CnZvaWQgcHVzaF9iYWNrKExpc3QgKkwsIEVsZW1lbnRUeXBlIHgpewoJTC0+ZGF0YVtMLT5zaXplXSA9IHg7CglMLT5zaXplKys7Cn0KRWxlbWVudFR5cGUgZWxlbWVudF9hdChMaXN0ICpMLCBpbnQgaSl7CglyZXR1cm4gTC0+ZGF0YVtpLTFdOwp9CmludCBjb3VudF9saXN0KExpc3QgKkwpewoJcmV0dXJuIEwtPnNpemU7Cn0Kdm9pZCBjb3B5X2xpc3QoTGlzdCAqTDEsTGlzdCAqTDIpewoJTDItPnNpemUgPSBMMS0+c2l6ZTsKCWludCBpOwoJZm9yKGk9MDtpPCBMMS0+c2l6ZTtpKyspewoJCUwyLT5kYXRhW2ldID0gTDEtPmRhdGFbaV07Cgl9Cn0KI2RlZmluZSBNQVhfU0laRSAxMDAKdHlwZWRlZiBpbnQgRWxlbWVudFR5cGU7CnR5cGVkZWYgc3RydWN0ewoJRWxlbWVudFR5cGUgZGF0YVtNQVhfU0laRV07CglpbnQgZnJvbnQsIHJlYXI7Cn1RdWV1ZTsKdm9pZCBtYWtlX251bGxfcXVldWUoUXVldWUgKlEpewoJUS0+ZnJvbnQgPSAtMTsKCVEtPnJlYXIgPSAtMTsKfQp2b2lkIGVucXVldWUoUXVldWUgKlEsIEVsZW1lbnRUeXBlIHUpewoJUS0+cmVhcisrOwoJUS0+ZGF0YVtRLT5yZWFyXT11Owp9CkVsZW1lbnRUeXBlIGZyb250KFF1ZXVlICpRKXsKCXJldHVybiBRLT5kYXRhW1EtPmZyb250XTsKfQp2b2lkIGRlcXVldWUoUXVldWUgKlEpewoJUS0+ZnJvbnQrKzsKfQppbnQgZW1wdHkoUXVldWUgKlEpewoJcmV0dXJuIFEtPmZyb250ID4gUS0+cmVhcjsKfQoKaW50IG1heChpbnQgYSwgaW50IGIpewoJcmV0dXJuIChhPmIpP2E6YjsKfQppbnQgbWluKGludCBhLCBpbnQgYil7CglyZXR1cm4gKGE8Yik/YTpiOwp9CnZvaWQgdG9wb19zb3J0KEdyYXBoICpHLCBMaXN0ICpMKXsKCWludCBkZWdbTUFYX05dOwoJaW50IHUseCx2OwoJLy9UaW5oIGJhYyB2YW8gY3VhIHUKCWZvcih1PTE7IHU8PUctPm47dSsrKXsKCQlkZWdbdV0gPSAwOwoJCWZvcih4PTE7eDw9Ry0+bjt4KyspewoJCQlpZihHLT5BW3hdW3VdICE9IDApCgkJCQlkZWdbdV0rKzsKCQl9Cgl9CglRdWV1ZSBROwoJbWFrZV9udWxsX3F1ZXVlKCZRKTsKCWZvcih1PTE7dTw9Ry0+bjt1KyspewoJCWlmKGRlZ1t1XT09MCkKCQllbnF1ZXVlKCZRLHUpOwoJfQoJbWFrZV9udWxsKEwpOwoJd2hpbGUoIWVtcHR5KCZRKSl7CgkJaW50IHUgPSBmcm9udCgmUSk7CgkJZGVxdWV1ZSgmUSk7CgkJcHVzaF9iYWNrKEwsdSk7CgkJZm9yKHY9MTt2PD1HLT5uO3YrKyl7CgkJCWlmKEctPkFbdV1bdl0gIT0gMCl7CgkJCQlkZWdbdl0tLTsKCQkJCWlmKGRlZ1t2XT09MCkKCQkJCQllbnF1ZXVlKCZRLHYpOwoJCQl9CgkJfQoJfQp9CgppbnQgZFtNQVhfTl07CmludCByW01BWF9OXTsKCmludCBtYWluKCl7CglHcmFwaCBHOwoJaW50IG4sdSx4LHYsajsKCWludCBqb2IsIHRpbWU7CgkKLy8gCWZyZW9wZW4oImR0LnR4dCIsICJyIiwgc3RkaW4pOwoJc2NhbmYoIiVkIiwgJm4pOwoJaW5pdF9ncmFwaCgmRywgbisyKTsKCWludCBhbHBoYSA9IG4rMSwgYmV0YSA9IG4rMjsKCWRbYWxwaGFdID0gMDsKCWZvcih1PTE7dTw9bjt1KyspewoJCXNjYW5mKCIlZCIsICZkW3VdKTsKCQlkb3sKCQkJc2NhbmYoIiVkIiwgJngpOwoJCQlpZih4PjApIGFkZF9lZGdlKCZHLCB4LCB1KTsKCQl9d2hpbGUoeD4wKTsKCX0KCXNjYW5mKCIlZCAlZCIsICZqb2IsICZ0aW1lKTsKCQoJZm9yKHU9MTt1PD1uO3UrKyl7CgkJaW50IGRlZ19uZWcgPSAwOwoJCWZvcih4PTE7eDw9bjt4KyspewoJCQlpZihHLkFbeF1bdV0gPiAwKSBkZWdfbmVnKys7CgkJfQoJCWlmKGRlZ19uZWcgPT0gMCkgYWRkX2VkZ2UoJkcsIGFscGhhLCB1KTsKCX0KCQoJZm9yKHU9MTt1PD1uO3UrKyl7CgkJaW50IGRlZ19wb3MgPSAwOwoJCWZvcih2PTE7djw9bjt2KyspewoJCQlpZihHLkFbdV1bdl0gPiAwKSBkZWdfcG9zKys7CgkJfQoJCWlmKGRlZ19wb3M9PTApIGFkZF9lZGdlKCZHLCB1LCBiZXRhKTsKCX0KCUxpc3QgTDsKCXRvcG9fc29ydCgmRywgJkwpOwoJCglpbnQgdFtNQVhfTl07Cgl0W2FscGhhXSA9IDA7Cglmb3Ioaj0yO2o8PUwuc2l6ZTtqKyspewoJCWludCB1ID0gZWxlbWVudF9hdCgmTCwgaik7CgkJdFt1XSA9IDA7CgkJZm9yKHg9MTt4PD1HLm47eCsrKXsKCQkJaWYoRy5BW3hdW3VdID4gMCkKCQkJCXRbdV0gPSBtYXgodFt1XSwgdFt4XSArIGRbeF0pOwoJCX0KCX0KCglpbnQgVFtNQVhfTl07CglUW2JldGFdID0gdFtiZXRhXTsKCQoJZm9yKGo9TC5zaXplLTE7aj49MTtqLS0pewoJCWludCB1ID0gZWxlbWVudF9hdCgmTCwgaik7CgkJVFt1XSA9ICtvbzsKCQlmb3Iodj0xO3Y8PUcubjt2KyspewoJCQlpZihHLkFbdV1bdl0gPiAwKQoJCQlUW3VdID0gbWluKFRbdV0sIFRbdl0gLSBkW3VdKTsKCQl9Cgl9CglwcmludGYoIiVkXG4iLCBUW2JldGFdKTsKCWZvcih1PTE7dTw9Ry5uO3UrKyl7CgkJcHJpbnRmKCIlZC0lZFxuIiwgdFt1XSwgVFt1XSk7Cgl9CglyZXR1cm4gMDsKfQ==