SDUT OJ 2138 最短路
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int n,h[1010]; 6 7 struct M 8 { 9 int data; 10 struct M *next; 11 }*head[1010]; 12 13 struct Q 14 { 15 int step; 16 int site; 17 }; 18 19 void init() 20 { 21 int i; 22 for(i = 1;i <= n; i++) 23 { 24 head[i] = (struct M *)malloc(sizeof(struct M)); 25 head[i]->data = -1; 26 head[i]->next = NULL; 27 } 28 } 29 30 void link(int u,int v) 31 { 32 struct M *p1,*p2,*q; 33 q = (struct M * )malloc(sizeof(struct M)); 34 q->next = NULL; 35 q->data = v; 36 for(p1 = head[u],p2 = p1->next;p2 != NULL; p1 = p1->next,p2 = p2->next) 37 { 38 if(p1->data < v && p2->data > v) 39 { 40 q->next = p1->next; 41 p1->next = q; 42 return; 43 } 44 else if(p2->data == v) {free(q);return;} 45 } 46 p1->next = q; 47 } 48 49 int seek(int mb) 50 { 51 int s,e,temp,step; 52 struct M *p; 53 struct Q q[1010]; 54 s = e = 0; 55 q[e].site = mb; 56 q[e++].step = 0; 57 while(s < e) 58 { 59 mb = q[s].site; 60 temp = q[s++].step; 61 for(p = head[mb];p != NULL;p = p->next) 62 { 63 if(!h[p->data]) 64 { 65 if(p->data == 1) return temp; 66 q[e].site = p->data; 67 q[e++].step = temp + 1; 68 h[p->data] = 1; 69 } 70 } 71 } 72 return -1; 73 } 74 75 int main() 76 { 77 int m,i,u,v,step; 78 while(scanf("%d %d",&n,&m) == 2) 79 { 80 if(n == 1) {printf("0\n");continue;} 81 init(); 82 for(i = 0;i < m; i++) 83 { 84 scanf("%d %d",&u,&v); 85 link(u,v); 86 } 87 memset(h,0,sizeof(h)); 88 h[n] = 1; 89 step = seek(n); 90 if(step >= 0) printf("%d\n",step+1); 91 else printf("NO\n"); 92 } 93 return 0; 94 }