这题是我在没学Dijkstra算法时做的,所以跟模板有点不一样,但是意思差不多。如果要看标准的Dijkstra算法的话,可以去查有关知识。
代码如下:
// Time 0ms, Memory 5884K
#include<stdio.h> #include<string.h> int map[1200][1200],v1[1200],v2[1200],l,d1[1200],d; int f(int x) { int i,min,n=0,y,z,m=-1,v[1200]; memset(d1,-1,sizeof(d1)); memset(v,-1,sizeof(v)); y=x;d1[x]=0; while(1) { min=-1; for(i=0;i<=l;i++) if(v1[i] && v[i]) { if(map[y][i]!=-1 && (d1[i]==-1 || d1[i]>(d1[y]+map[y][i]))) d1[i]=d1[y]+map[y][i]; if(min==-1 || (d1[i]!=-1 && min>d1[i])) { min=d1[i];z=i; } } if(min==-1) return m; v[z]=0;y=z; if(v2[z]) { n++; if(m==-1 || m>d1[z]) m=d1[z]; } if(n==d) return m; } } int main() { int t,s,a,b,i,p[1200],q[1200],min,m1,w; while(scanf("%d%d%d",&t,&s,&d)==3) { memset(map,-1,sizeof(map)); memset(v1,0,sizeof(v1)); memset(v2,0,sizeof(v2)); l=-1;min=-1; while(t--) { scanf("%d%d%d",&a,&b,&w); if(map[b][a]==-1 || map[a][b]>w) map[b][a]=map[a][b]=w; if(l==-1 || l<a) l=a; if(l<b) l=b; v1[a]=1;v1[b]=1; } for(i=0;i<s;i++) { scanf("%d",&p[i]);v1[p[i]]=0; } for(i=0;i<d;i++) { scanf("%d",&q[i]);v2[q[i]]=1; } for(i=0;i<s;i++) { if(v2[p[i]]) { min=0;break; } m1=f(p[i]); if(min==-1 || (m1!=-1 && min>m1)) min=m1; } printf("%d\n",min); } return 0; }