您的位置:首页 > 其它

SDUT OJ 2138 最短路

2013-02-26 21:10 141 查看
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int n,h[1010];

struct M
{
int data;
struct M *next;
}*head[1010];

struct Q
{
int step;
int site;
};

void init()
{
int i;
for(i = 1;i <= n; i++)
{
head[i] = (struct M *)malloc(sizeof(struct M));
head[i]->data = -1;
head[i]->next = NULL;
}
}

void link(int u,int v)
{
struct M *p1,*p2,*q;
q = (struct M * )malloc(sizeof(struct M));
q->next = NULL;
q->data = v;
for(p1 = head[u],p2 = p1->next;p2 != NULL; p1 = p1->next,p2 = p2->next)
{
if(p1->data < v && p2->data > v)
{
q->next = p1->next;
p1->next = q;
return;
}
else if(p2->data == v) {free(q);return;}
}
p1->next = q;
}

int seek(int mb)
{
int s,e,temp,step;
struct M *p;
struct Q q[1010];
s = e = 0;
q[e].site = mb;
q[e++].step = 0;
while(s < e)
{
mb = q[s].site;
temp = q[s++].step;
for(p = head[mb];p != NULL;p = p->next)
{
if(!h[p->data])
{
if(p->data == 1) return temp;
q[e].site = p->data;
q[e++].step = temp + 1;
h[p->data] = 1;
}
}
}
return -1;
}

int main()
{
int m,i,u,v,step;
while(scanf("%d %d",&n,&m) == 2)
{
if(n == 1) {printf("0\n");continue;}
init();
for(i = 0;i < m; i++)
{
scanf("%d %d",&u,&v);
link(u,v);
}
memset(h,0,sizeof(h));
h
= 1;
step = seek(n);
if(step >= 0) printf("%d\n",step+1);
else printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: