说是说一颗星啊,但是空间要考虑啊,这种图的结构是我第二次写,上一次我也不记得是什么时候了,反正是看到别人的代码写的,觉得这种结构挺好的!!线性存放整个图,使用起来也方便,就是不大好理解,我也不打算解释(个人很懒,语文成绩也不好,说不清楚。毕竟只是报告嘛,没打算太给别人看,呵呵。懒。。)。
代码:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int head[100000];
int next[200000];
int edge[200000];
int end;
void add(int a, int b)
{
edge[end] = b;
next[end] = head[a];
head[a] = end;
end++;
}
#define MAX 40000
int queue[MAX];
int s, t;
void enqueue(int k)
{
int l = (t + 1) % MAX;
assert(l != s);
queue[t] = k;
t = l;
}
int exqueue(void)
{
int l;
assert(s != t);
l = queue[s];
s = (s + 1) % MAX;
return l;
}
int dis[100000];
int main(int argc, char **argv)
{
int i, j;
int n, p, c, m;
int a, b;
scanf("%d%d%d%d", &n, &p, &c, &m);
for(i = 0; i < n; i++){
head[i] = -1;
dis[i] = 0xFFFFFFF;
}
enqueue(c - 1);
dis[c - 1] = 1;
for(i = 0; i < p; i++){
scanf("%d%d", &a, &b);
a--, b--;
add(a, b);
add(b, a);
}
while(s != t){
j = exqueue();
for(i = head[j]; i != -1; i = next[i]){
if(dis[edge[i]] > dis[j] + 1){
dis[edge[i]] = dis[j] + 1;
enqueue(edge[i]);
}
}
}
printf("%d\n", dis[j] + m);
return 0;
}