POJ2387 Til the Cows Come Home Dijkstra C语言

题目:http://poj.org/problem?id=2387

题目大意:找出从1到n的最短路

算法:Dijkstra

思路:很裸的Dijkstra,主要是想练习用邻接表建图

提交情况:WA 3次, RE 3次, AC 1次

总结:很裸的Dijkstra,主要是想练习用邻接表建图。AC的很纠结,先是懒没有判重,后来发现是无向图,改完就开始RE,开了2100的边集,一直RE,开到20100才AC。题目明明写的T <= 2000 啊,为什么就不够呢……

AC code:

View Code
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #define MAXV (1000 + 50)
6 #define MAXE (20000 + 100)
7 #define INF 0xfffffff
8
9 struct NODE {
10 int to;
11 int len;
12 int next;
13 }edge[MAXE];
14
15 int head[MAXV];
16 int dis[MAXV], vis[MAXV];
17 int ad;
18
19 void Clear() {
20 memset(dis, 0x3f, sizeof(dis));
21 memset(edge, 0x3f, sizeof(edge));
22 memset(vis, 0, sizeof(vis));
23 memset(head, -1, sizeof(head));
24 ad = 0;
25 }
26
27 void INSERT(int u, int v, int len) {
28 edge[ad].to = v;
29 edge[ad].len = edge[ad].len < len ? edge[ad].len : len;
30 edge[ad].next = head[u];
31 head[u] = ad++;
32 }
33
34 void Dijkstra(int s, int v) {
35 int i, j;
36 int min, u;
37 dis[s] = 0;
38 for(i = 1; i <= v; i++) {
39 min = INF;
40 for(j = 1; j <= v; j++)
41 if(!vis[j] && dis[j] < min) {
42 min = dis[j];
43 u = j;
44 }
45 vis[u] = 1;
46 for(j = head[u]; ~j; j = edge[j].next)
47 if(dis[edge[j].to] > dis[u] + edge[j].len)
48 dis[edge[j].to] = dis[u] + edge[j].len;
49 }
50 }
51
52 int main() {
53 int n, t;
54 int u, v, len;
55 scanf("%d%d", &t, &n);
56 Clear();
57 for(int i = 1; i <= t; i++) {
58 scanf("%d%d%d", &u, &v, &len);
59 INSERT(u, v, len);
60 INSERT(v, u, len);
61 }
62 Dijkstra(1, n);
63 printf("%d\n", dis[n]);
64 return 0;
65 }
posted @ 2011-07-22 11:11  cloehui  阅读(223)  评论(0编辑  收藏  举报