hdu2851(2009多校第四场) 点权最短路转化为边
只需要把这条边上的最短路当成后一个点的权就好啦
唯一的起始点1到1的距离就是g[1][1]
这样相当于1被分离出来啦!
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int n,m,vis[2005],dist[2005],g[2005][2005]; 6 int x[2005],y[2005],v[2005]; 7 void dijkstra() 8 { 9 int i,j,minx,mini; 10 dist[1]=g[1][1]; 11 memset(vis,0,sizeof(vis)); 12 for (j=1;j<=n;j++) 13 { 14 minx=0x3f3f3f3f; mini=0; 15 for (i=1;i<=n;i++) 16 if (dist[i]<minx&&vis[i]==0) 17 { 18 minx=dist[i]; 19 mini=i; 20 } 21 if (mini==0) break; 22 vis[mini]=1; 23 for (i=1;i<=n;i++) 24 dist[i]=min(dist[mini]+g[mini][i],dist[i]); 25 } 26 return; 27 } 28 int main() 29 { 30 int T,i,j; 31 scanf("%d",&T); 32 while (T--) 33 { 34 scanf("%d%d",&n,&m); 35 memset(g,0x3f,sizeof(g)); 36 memset(dist,0x3f,sizeof(dist)); 37 for (i=1;i<=n;i++) 38 { 39 scanf("%d%d%d",&x[i],&y[i],&v[i]); 40 for (j=1;j<=i;j++) 41 if (y[j]>=x[i]) 42 g[j][i]=v[i]; 43 44 } 45 dijkstra(); 46 for (i=1;i<=m;i++) 47 { 48 scanf("%d",&n); 49 if (dist[n]>=0x3f3f3f3f) printf("-1\n"); 50 else printf("%d\n",dist[n]); 51 } 52 } 53 return 0; 54 }