HDU - 4034 Graph (floyd变形)
2015-08-01 00:33
302 查看
题目大意:给出每个点之间的最短距离,问需要几条边才能形成这张图
解题思路:100个点,果断floyd,接着判断
如果dp[i][j] > dp[i][k] + dp[k][j]表示这张图构建不了,因为最短路冲突了
如果dp[i][j] == dp[i][k] + dp[k][j],就表示ij这条路可以被ik和kj取代,那么这条路就可去掉了
去掉的路记得标记。。。WA了好多次
解题思路:100个点,果断floyd,接着判断
如果dp[i][j] > dp[i][k] + dp[k][j]表示这张图构建不了,因为最短路冲突了
如果dp[i][j] == dp[i][k] + dp[k][j],就表示ij这条路可以被ik和kj取代,那么这条路就可去掉了
去掉的路记得标记。。。WA了好多次
[code]#include <cstdio> #include <algorithm> using namespace std; #define N 110 int dis , cas = 1, n; bool vis ; void init() { scanf("%d", &n); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { scanf("%d", &dis[i][j]); vis[i][j] = 0; } } int floyd() { int ans = n * (n -1); for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { if (dis[i][j] > dis[i][k] + dis[k][j]){ return -1; } if (i != k && k != j && i != j && !vis[i][j] && dis[i][j] == dis[i][k] + dis[k][j]) { vis[i][j] = 1; ans--; } } return ans; } void solve() { int ans = floyd(); printf("Case %d: ", cas++); if (ans == -1) printf("impossible\n"); else printf("%d\n", ans); } int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0; }
相关文章推荐
- Hadoop之RPC Server源码分析
- jquery easyui datagrid实现数据修改
- 黑马程序员----java基础String和stringbuffer总结
- Android NDK的入门程序 FATAL EXCEPTION
- hdu 5288 OO’s Sequence
- Objective-C静态库中含有category怎么办?
- MySQL实现操作表
- ReferenceError: Invalid assignment left-hand side
- PHP—准备篇
- nyoj47 过河问题
- Apache + mod_jk+Tomcat 一个简单的集群实践
- 2015-8.1
- Scala学习回顾(七)---- 抽象类、抽象字段、抽象方法
- 【攻克Android (13)】Menu 菜单
- 学习资源
- slf4j 简介
- Oracle 树操作(select…start with…connect by…prior)
- HDU1664 Different Digits(bfs +数论剪枝)
- HDU - 4293 Groups (DP)
- ubuntu 14.04系统下安装 VMware Tools 方法