poj3159
SPFA:bfs形式超时,各种优化还是超时,手敲循环队列还超,伤不起啊,有木有
我必须晒晒代码,以泄我愤。
slf
View Code
1 #include <stdio.h>
2 #include <queue>
3 using std::deque;
4 #define MAXN 150010
5 #define MAX 30010
6 #define INF (1<<29)
7 int n,m;
8 deque <int> q;
9 struct node
10 {
11 int d,t;
12 node* next;
13 }*h1[MAX],e1[MAXN],*p;
14 bool v[MAX];
15 int t[MAX];
16 void spfa()
17 {
18 for(int i=1;i<=n;++i) t[i]=INF;
19 t[1]=0;
20 q.push_back(1);
21 v[1]=true;
22 int k;
23 while(!q.empty())
24 {
25 k=q.front();
26 q.pop_front();
27 v[k]=false;
28 for(p=h1[k];p;p=p->next)
29 if(t[p->d]>t[k]+p->t)
30 {
31 t[p->d]=t[k]+p->t;
32 if(!v[p->d])
33 {
34 v[p->d]=true;
35 if(!q.empty()&&t[p->d]<t[q.front()])
36 q.push_front(p->d);
37 else
38 q.push_back(p->d);
39 }
40 }
41 }
42 }
43 int main()
44 {
45 scanf("%d %d",&n,&m);
46 p=e1;
47 for(int i=0,a,b,c;i<m;++i)
48 {
49 scanf("%d %d %d",&a,&b,&c);
50 p->d=b;
51 p->t=c;
52 p->next=h1[a];
53 h1[a]=p++;
54 }
55 spfa();
56 printf("%d\n",t[n]);
57 return 0;
58 }
手敲循环队列
View Code
1 #include <stdio.h>
2 #define MAXN 150010
3 #define MAX 30010
4 #define INF (1<<29)
5 #define DEC(a) ((a-1+n+1)%(n+1))
6 #define INC(a) ((a+1)%(n+1))
7 int n,m;
8 struct node
9 {
10 int d,t;
11 node* next;
12 }*h1[MAX],e1[MAXN],*p;
13 bool v[MAX];
14 int t[MAX];
15 int queue[MAX],beg,end;
16 void input()
17 {
18 int a,b,c;
19 scanf("%d %d %d",&a,&b,&c);
20 p->d=b;
21 p->t=c;
22 p->next=h1[a];
23 h1[a]=p++;
24 }
25 bool empty()
26 {
27 if(end==beg)
28 return true;
29 else
30 return false;
31 }
32 int front()
33 {
34 return queue[beg];
35 }
36 void push(int a)
37 {
38 queue[end]=a;
39 end=DEC(end);
40 }
41 void pop()
42 {
43 beg=DEC(beg);
44 }
45 void spfa()
46 {
47 for(int i=1;i<=n;++i)
48 t[i]=INF,v[i]=false;
49 t[1]=0;
50 beg=end=0;
51 end=DEC(end);
52 push(1);
53 v[1]=true;
54 int k;
55 while(!empty())
56 {
57 k=front();
58 pop();
59 v[k]=false;
60 for(p=h1[k];p;p=p->next)
61 if(t[p->d]>t[k]+p->t)
62 {
63 t[p->d]=t[k]+p->t;
64 if(!v[p->d])
65 {
66 v[p->d]=true;
67 push(p->d);
68 }
69 }
70 }
71 }
72 int main()
73 {
74 scanf("%d %d",&n,&m);
75 for(int i=1;i<=n;h1[i++]=NULL);
76 p=e1;
77 for(int i=0;i<m;++i)
78 input();
79 spfa();
80 printf("%d\n",t[n]);
81 return 0;
82 }
dfs果断水过
View Code
1 #include <stdio.h>
2 #include <stack>
3 using std::stack;
4 #define MAXN 150010
5 #define MAX 30010
6 #define INF (1<<29)
7 int n,m;
8 stack <int> q;
9 struct node
10 {
11 int d,t;
12 node* next;
13 }*h1[MAX],e1[MAXN],*p;
14 bool v[MAX];
15 int t[MAX];
16 void spfa()
17 {
18 for(int i=1;i<=n;++i) t[i]=INF;
19 t[1]=0;
20 q.push(1);
21 v[1]=true;
22 int k;
23 while(!q.empty())
24 {
25 k=q.top();
26 q.pop();
27 v[k]=false;
28 for(p=h1[k];p;p=p->next)
29 if(t[p->d]>t[k]+p->t)
30 {
31 t[p->d]=t[k]+p->t;
32 if(!v[p->d])
33 {
34 v[p->d]=true;
35 q.push(p->d);
36 }
37 }
38 }
39 }
40 int main()
41 {
42 scanf("%d %d",&n,&m);
43 p=e1;
44 for(int i=0,a,b,c;i<m;++i)
45 {
46 scanf("%d %d %d",&a,&b,&c);
47 p->d=b;
48 p->t=c;
49 p->next=h1[a];
50 h1[a]=p++;
51 }
52 spfa();
53 printf("%d\n",t[n]);
54 return 0;
55 }
泄愤归泄愤,个人觉得此题之所以dfs过的快可能是图的层数不多,但是每层节点多,所以dfs可以较快得到最优解松弛所有节点,而bfs则进行比较慢,以后若是确定最短路,且图比较稀疏,那么bfs超时的用dfs试试。