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 }