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 }

 

转载于:https://www.cnblogs.com/AC-Phoenix/p/4475117.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值