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 }
View Code

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

posted on 2014-12-16 19:52  xiao_xin  阅读(321)  评论(0编辑  收藏  举报

导航