hdu 2680 Choose the best route

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680

在有向图中求多点到一个点的距离的最小值,思路反向建图+dijstra

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int INF=12345678;
 6 const int MAX=1005;
 7 struct ss {
 8     int y,value,next;
 9 }edge[20*MAX];
10 int head[MAX];
11 int visit[MAX];
12 int disit[MAX];
13 
14 int n,m,N;
15 void init()
16 {
17     int i;
18     memset(visit,0,sizeof(visit));
19     memset(head,-1,sizeof(head));
20     memset(edge,0,sizeof(edge));
21     for (i=1;i<=n;i++)
22     {
23         disit[i]=INF;
24     }
25     N=1;
26 }
27 void Dijstra(int s)
28 {
29     int i,j,v,ma,t;
30     for (i=head[s];i!=-1;i=edge[i].next)
31         disit[edge[i].y]=edge[i].value;
32     
33     disit[s]=0;
34     visit[s]=1;
35     v=s;
36     for (i=1;i<n;i++)
37     {    
38         for (j=head[v];j!=-1;j=edge[j].next)
39             {
40                 t=edge[j].y;
41                 if(!visit[t]&&(disit[t]>(disit[v]+edge[j].value)))
42                     disit[t]=disit[v]+edge[j].value;
43             }
44         
45         ma=INF;
46         for (j=1;j<=n;j++)
47             if(!visit[j]&&disit[j]<ma){
48                 ma=disit[j];
49                 v=j;
50             }
51             if(ma==INF)break;
52             visit[v]=1;
53     }
54 }
55 
56 int main()
57 {
58     int i,s,x,y,z,t,ma;
59     while (scanf("%d%d%d",&n,&m,&s)!=EOF)
60     {
61         init();
62         for (i=1;i<=m;i++)
63         {
64             scanf("%d%d%d",&x,&y,&z);
65             
66             edge[N].y=x;
67             edge[N].value=z;
68             edge[N].next=head[y];
69             head[y]=N++;
70         }
71         Dijstra(s);
72         scanf("%d",&t); 
73         ma=INF;
74         for (i=1;i<=t;i++)
75         {
76             scanf("%d",&x);
77             if(disit[x]<ma)ma=disit[x];
78         }
79         if(ma==INF)printf("-1\n");
80         else printf("%d\n",ma);        
81     }
82     return 0;
83 }
这个是直接求(见轻工的这样写,不过这个似乎有点乱)
View Code
 1 # include<stdio.h>
 2 # include<string.h>
 3 # define PI 0xfffffff
 4 int adj[1005][1005],low[1005],visit[1005];
 5 int main()
 6 {
 7     int i,m,n,w,s,p,q,t,index,index1,min,x;
 8     while(scanf("%d%d%d",&n,&m,&s)!=EOF)
 9     {
10         memset(adj,-1,sizeof(adj));
11         for(i=1;i<=m;i++)
12         {
13             scanf("%d%d%d",&p,&q,&t);
14             if(adj[p][q]==-1 || adj[p][q]>t) adj[p][q]=t;
15         }
16         scanf("%d",&w);
17         for(i=1;i<=n;i++)
18         {
19             visit[i]=0;
20             low[i]=PI;
21         }
22         for(i=1;i<=w;i++)
23         {
24             scanf("%d",&x);
25             low[x]=0;
26         }
27         index=x;
28         while(index!=s)
29         {
30             min=PI;
31             visit[index]=1;
32             for(i=1;i<=n;i++)
33             {
34                 if(visit[i]==1) continue;
35                 if(adj[index][i]==-1 && low[i]==PI) continue;
36                 if(adj[index][i]!=-1)
37                 {
38                     if(low[i]==-1 || adj[index][i]+low[index]<low[i]) low[i]=adj[index][i]+low[index];
39                 }
40                 if(low[i]<min){min=low[i];index1=i;}
41             }
42             if(min==PI) break;
43             index=index1;
44         }
45         if(low[s]==PI) printf("-1\n");
46         else printf("%d\n",low[s]);
47     }
48     return 0;
49 }

 

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 # define PI 0xfffffff
 6 int adj[1005][1005],low[1005],visit[1005];
 7 int main()
 8 {
 9     int i,m,n,w,s,p,q,t,index,index1,min,x;
10     while(scanf("%d%d%d",&n,&m,&s)!=EOF)
11     {
12         memset(adj,-1,sizeof(adj));
13         for(i=1;i<=m;i++)
14         {
15             scanf("%d%d%d",&p,&q,&t);
16             if(adj[p][q]==-1 || adj[p][q]>t) adj[p][q]=t;
17         }
18         scanf("%d",&w);
19         for(i=1;i<=n;i++)
20         {
21             visit[i]=0;
22             low[i]=PI;
23         }
24         for(i=1;i<=w;i++)
25         {
26             scanf("%d",&x);
27             low[x]=0;
28         }
29         index=x;
30         while(index!=s)
31         {
32             min=PI;
33             visit[index]=1;
34             for(i=1;i<=n;i++)
35             {
36                 if(visit[i]==1) continue;
37                 if(adj[index][i]==-1&&low[i]==PI) continue;
38                 if(adj[index][i]!=-1)
39                 {
40                     if(low[i]==PI || adj[index][i]+low[index]<low[i]) low[i]=adj[index][i]+low[index];
41                 }
42                 if(low[i]<min){min=low[i];index1=i;}
43             }
44             if(min==PI) break;
45             index=index1;
46         }
47         if(low[s]==PI) printf("-1\n");
48         else printf("%d\n",low[s]);
49     }
50     return 0;
51 }

 

posted @ 2012-04-17 16:58  我们一直在努力  阅读(192)  评论(0编辑  收藏  举报