uva 10246(变形floyd)
2014-01-11 17:08
411 查看
这道题是world finals的热身赛第一题。弱菜花了两个小时在做出来-。-
题意:给你一张无向图,然后给若干个查询,问你任意两个定点之间的最短路。最短路的定义是这样的:每个定点有权值,每个边也有权值,最短路等于路径上的所有边权值之和+所有定点的权值最大值。
思路:这道题先分析一下测试数据,顶点最多只有80个边最多有1000条所以一定是有重边的,这道题又要用邻接矩阵存所以输入的时候注意一下就好了,然后看查询有6000+个所以还是会有很多重复的,因此我们就可以想到用floyd来做这道题了。那么定点的权值怎么处理呢?我们想到了floyd的dp过程是按定点顺序的,所以我们将顶点按照花费排个序,这样有序的dp就能解出答案了。
代码如下:
View Code
题意:给你一张无向图,然后给若干个查询,问你任意两个定点之间的最短路。最短路的定义是这样的:每个定点有权值,每个边也有权值,最短路等于路径上的所有边权值之和+所有定点的权值最大值。
思路:这道题先分析一下测试数据,顶点最多只有80个边最多有1000条所以一定是有重边的,这道题又要用邻接矩阵存所以输入的时候注意一下就好了,然后看查询有6000+个所以还是会有很多重复的,因此我们就可以想到用floyd来做这道题了。那么定点的权值怎么处理呢?我们想到了floyd的dp过程是按定点顺序的,所以我们将顶点按照花费排个序,这样有序的dp就能解出答案了。
代码如下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <queue> #include <stack> #include <vector> #define MP(a, b) make_pair(a, b) #define PB(a) push_back(a) using namespace std; typedef long long ll; typedef pair<int ,int> pii; typedef pair<unsigned int, unsigned int> puu; typedef pair<int ,double> pid; typedef pair<ll, int> pli; const int INF = 0x3f3f3f3f; const double eps = 1e-6; const int LEN = 101; struct V{int tag, val;}; int Map[LEN][LEN], dis[LEN][LEN][LEN], n, m; V vex[LEN]; inline bool cmp(V a, V b){return a.val<b.val;} void floyd() { for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ dis[i][j][0] = Map[i][j]; if(i==j)dis[i][j][0] = 0; } } for(int x=1; x<=n; x++){ int k = vex[x].tag; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ dis[i][j][x] = min(dis[i][j][x-1], dis[i][k][x-1]+dis[k][j][x-1]); } } } } int main() { // freopen("in.txt", "r", stdin); int q, kase = 1, tval, a, b; while(scanf("%d%d%d", &n, &m, &q)!=EOF){ if(!n && !m && !q)break; if(kase!=1)printf("\n"); memset(dis, 0x3f, sizeof dis); memset(Map, 0x3f, sizeof Map); for(int i=1; i<=n; i++){ vex[i].tag = i; scanf("%d", &vex[i].val); } for(int i=0; i<m; i++){ scanf("%d%d%d", &a, &b, &tval); Map[a][b] = min(Map[a][b], tval); Map[b][a] = min(Map[b][a], tval); } sort(vex+1, vex+n+1, cmp); floyd(); printf("Case #%d\n", kase++); for(int i=0; i<q; i++){ scanf("%d%d", &a, &b); int ans = INF, inv = 0; for(int j=1; j<=n; j++)if(vex[j].tag==a || vex[j].tag==b)inv = max(inv, vex[j].val); for(int j=1; j<=n; j++){ ans = min(ans, dis[a][b][j]+max(vex[j].val, inv)); } if(ans!=INF)printf("%d\n", ans); else printf("-1\n"); } } return 0; }
View Code
相关文章推荐
- UVA - 10048 Audiophobia floyd的变形
- UVA - 125 Numbering Paths floyd的变形
- UVa - 10048 - Audiophobia ( Floyd 变形 )
- UVA 104 - Arbitrage(floyd变形)
- Uva 10048 噪音恐惧症——Floyd变形
- uva 436(floyd变形)
- uva 104(变形floyd)
- uva 10048 - Audiophobia(floyd 的变形)
- 11.3.4-uva10048-floyd变形-两点之间路径上最大边的最小值
- 噪音恐惧症(Audiophobia,UVa10048)——floyd变形,最大最小化
- UVA 10305 - Ordering Tasks(变形的Floyd)
- UVA10048 Audiophobia (floyd变形)
- uva 10058 Audiophobia floyd变形
- uva 10246(最短路变形)
- 紫书例题 11-5 Uva 10048 Floyd变形或者Kruskal离线
- 11.3.4 例题11-5 UVA 247 Audiophobia(两点间最大权最小_floyd()变形)
- uva 10246(最短路变形)
- uva 10048 - Audiophobia(floyd 的变形)
- UVA 10048 Audiophobia(Floyd变形)
- UVa10246 - Asterix and Obelix(最短路径变形)