您的位置:首页 > 其它

BZOJ1774: [Usaco2009 Dec]Toll 过路费

2017-08-30 13:43 323 查看

n<=250个点m<=10000边无自环图,有点权边权,Q<=10000个询问i到j的最短路。这里的路径长度指路上边权和+路上点权最大值。

n这么小,询问这么多,那就跑跑floyd吧!f[i][j]记最短路,g[i][j]记最短路上最大点权,当f[i][j]+g[i][j]>f[i][k]+f[k][j]+max(g[i][k],g[k][j])时更新答案,注意不要用无效状态即可。

1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<math.h>
5 //#include<iostream>
6 using namespace std;
7
8 int n,m,q;
9 #define maxn 261
10 int f[maxn][maxn],g[maxn][maxn];
11 int x,y,v;
12 const int inf=1e9;
13 int max(int a,int b) {return a>b?a:b;}
14 int min(int a,int b) {return a<b?a:b;}
15 int a[maxn];
16 struct Point{int id,v;bool operator < (const Point &b) const {return v<b.v;}}p[maxn];
17 int main()
18 {
19     scanf("%d%d%d",&n,&m,&q);
20     for (int i=1;i<=n;i++)
21         for (int j=1;j<=n;j++)
22             f[i][j]=g[i][j]=inf;
23     for (int i=1;i<=n;i++)
24     {
25         scanf("%d",&a[i]);
26         g[i][i]=p[p[i].id=i].v=a[i];
27         f[i][i]=0;
28     }
29     sort(p+1,p+1+n);
30     for (int i=1;i<=m;i++)
31     {
32         scanf("%d%d%d",&x,&y,&v);
33         if (v<f[x][y]) f[x][y]=f[y][x]=v;
34     }
35     for (int k=1;k<=n;k++)
36         for (int i=1;i<=n;i++)
37             for (int j=1;j<=n;j++)
38             {
39                 int x=p[k].id;
40                 f[i][j]=min(f[i][j],f[i][x]+f[x][j]);
41                 g[i][j]=min(g[i][j],f[i][j]+max(p[k].v,max(a[i],a[j])));
42             }
43     for (int i=1;i<=q;i++)
44     {
45         scanf("%d%d",&x,&y);
46         printf("%d\n",g[x][y]);
47     }
48     return 0;
49 }
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: