hdu 2544 (spfa)

spfa的模板,但是,是用邻接表存边的,但是邻接表神物,不懂邻接表的可以去看我的邻接表随笔

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 #define xx 10005
 7 #define INF 0x2fffffff
 8 queue<int>que;
 9 int t,pre[xx];//边标号,表头;
10 int dis[xx],inque[xx];
11 struct node
12 {
13     int st,nd,ln,next;
14 }edge[xx];
15 void addedge(int st,int nd,int ln)
16 {
17     edge[t].st=st;
18     edge[t].nd=nd;
19     edge[t].ln=ln;
20     edge[t].next=pre[st];
21     pre[st]=t++;
22 }
23 void spfa(int n)
24 {
25     int i,u,v;
26     while(!que.empty())
27         que.pop();
28     fill(dis,dis+xx,INF);
29     memset(inque,0,sizeof(inque));
30     inque[1]=1;
31     dis[1]=0;
32     que.push(1);
33     while(!que.empty())
34     {
35         u=que.front();
36         que.pop();
37         inque[u]=0;
38         for(i=pre[u];i+1;i=edge[i].next)
39         {
40             v=edge[i].nd;
41             if(dis[v]>dis[u]+edge[i].ln)
42             {
43                 dis[v]=dis[u]+edge[i].ln;
44                 if(!inque[v])
45                 {
46                     inque[v]=1;
47                     que.push(v);
48                 }
49             }
50         }
51     }
52     printf("%d\n",dis[n]);
53 }
54 int main()
55 {
56     int n,m,i;
57     int st,nd,ln;
58     while(scanf("%d%d",&n,&m)!=EOF)
59     {
60         if(n==0&&m==0)
61             break;
62         t=1;
63         memset(pre,-1,sizeof(pre));
64         for(i=1;i<=m;i++)
65         {
66             scanf("%d%d%d",&st,&nd,&ln);
67             if(st!=nd)
68             {
69                 addedge(st,nd,ln);
70                 addedge(nd,st,ln);
71             }
72         }
73         spfa(n);
74     }
75     return 0;
76 }

 

posted @ 2012-08-09 21:18  M_cag  阅读(159)  评论(0编辑  收藏  举报