HDU 4034 Graph Floyd变形

戳这里:HDU 4034

//思路:根据题意可得,若 mat[i][j] > mat[i][k] + mat[k][j] 则无解;若 mat[i][j] == mat[i][k] + mat[k][j] 且分别对应 i->j  i->k  k->j 的三条有向边,则可以删掉 i->j 有向边使得原来 i 到 j 的最短路径不发生变化; 那么我们将输入的邻接矩阵当成一个有向完全图,不断的删除多余的边,得到只含最少边的最优解。实现起来要注意删边操作对判无解操作的影响

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int T, N;
 4 int mat[110][110];
 5 const int INF = 0x3f3f3f3f;
 6
 7 int main()
 8 {
 9     scanf("%d", &T);
10     int t;
11     for(t = 1; t <= T; ++t) {
12         scanf("%d", &N);
13         int i, j;
14         for(i = 1; i <= N; ++i) {
15             for(j = 1; j <= N; ++j) {
16                 scanf("%d", &mat[i][j]);
17             }
18         }
19
20         bool ok = 1;
21         int res = N * (N - 1);
22         int k;
23         for(k = 1; k <= N; ++k) {
24             for(i = 1; i <= N; ++i) {
25                 for(j = 1; j <= N; ++j) {
26                     if(i == j || j == k || k == i) {
27                         continue;
28                     }
29                     if(mat[i][j] != INF && mat[i][j] > mat[i][k] + mat[k][j]) { //!!!!!
30                         ok = 0;
31                         break;
32                     }
33                     if(mat[i][j] == mat[i][k] + mat[k][j]) {
34                         mat[i][j] = INF;
35                         --res;
36                     }
37                 }
38             }
39         }
40         printf("Case %d: ", t);
41         if(ok == 0) {
42             printf("impossible\n");
43         }
44         else {
45             printf("%d\n", res);
46         }
47     }
48 }
时间: 2024-10-29 10:45:46

HDU 4034 Graph Floyd变形的相关文章

HDU 4034 Graph(floyd,最短路,简单)

题目 一道简单的倒着的floyd. 具体可看代码,代码可简化,你有兴趣可以简化一下,就是把那个Dijsktra所实现的功能放到倒着的floyd里面去. #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAXN=110; const int INF=0x3f3f3f3f;//防止后面溢出,这个不能太大 bool vis[MAXN]; int pr

HDU 4034 Graph Floyd最短路

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4034 题意: 给你一个最短路的表,让你还原整个图,并使得边最少 题解: 这样想..这个表示通过floyd得到的,那么如果从u到v没有小于等于边(u,v)的路径,那么边(u,v)就是必须的,否则从u到v需要走更远的路.如果有路径和边(u,v)是一样的,那么边(u,v)就是不需要的,这是因为,任何需要从u到v的路径都可以用另外一条代替.如果有小于边(u,v)的,那么这就是个非法的最短路表. 代码: #i

hdu 4034 Graph (floyd的深入理解)

Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 1927    Accepted Submission(s): 965 Problem Description Everyone knows how to calculate the shortest path in a directed graph. In fact, the

hdu 4034 Graph

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4034 Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 1650    Accepted Submission(s): 826 Problem Des

hdu 1596(Floyd 变形)

http://acm.hdu.edu.cn/showproblem.php?pid=1596 find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6911    Accepted Submission(s): 2450 Problem Description XX星球有很多城市,每个城市之间有一条或

hdu 1217 (Floyd变形)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4430    Accepted Submission(s): 2013 Problem Description Arbitrage is the use of discr

hdu 4034 Graph(深化最短路floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4034 Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 2188    Accepted Submission(s): 1101 Problem Description Everyone knows how to calculat

HDU - 4034 Graph (floyd变形)

题目大意:给出每个点之间的最短距离,问需要几条边才能形成这张图 解题思路:100个点,果断floyd,接着判断 如果dp[i][j] > dp[i][k] + dp[k][j]表示这张图构建不了,因为最短路冲突了 如果dp[i][j] == dp[i][k] + dp[k][j],就表示ij这条路可以被ik和kj取代,那么这条路就可去掉了 去掉的路记得标记...WA了好多次 #include <cstdio> #include <algorithm> using namesp

hdu 4034 逆向floyd

给出一个最短路邻接矩阵,求出构图的最小边数 正常的floyd的k放在最外面是为了防止i到j的距离被提前确定,而逆向的floyd,i到j的距离已经确定,所以需要在i到j之间枚举k Sample Input 3 3 0 1 1 1 0 1 1 1 0 3 0 1 3 4 0 2 7 3 0 3 0 1 4 1 0 2 4 2 0 Sample Output Case 1: 6 Case 2: 4 Case 3: impossible 1 #include<stdio.h> 2 const int