hdu4034 逆向算
来源:互联网 发布:二进制数据压缩算法 编辑:程序博客网 时间:2024/05/16 09:56
题目描述:给你一个n*n矩阵来表示一个图,矩阵的每个元素gij都表示i点到j点的最短路,其中对角线元素总是0。问满足这个矩阵的图的最少边数是多少,若不存在,则输出impossible。
显然,边数最多的情况是每两点之间都有最短的直边相连,边数最多为n2-n,在每两点都有最短直边相连情况下,我们以一一删去多余的边,最后就是最终结果。 考虑:若gij = gik + gkj ,i 与 j的这条边可以删去,因为i到j的最短路gij可以由gik+gkj转移来;若gij > gik + gkj ,则说明矩阵的gij并不是最短路,存在矛盾,此时则不存在这样的图,输出impossible。
还有,需要注意的是,每条边最多被删去一次,所以当一条边被删去时,需要标记,防止多次被删。
#include<cstdio>#include<iostream>#include<cstring>#include<cmath>const int LEN=105;int path[LEN][LEN], vis[LEN][LEN], dis[LEN], n;int floyd(){ int ans=0; memset(vis, 0, sizeof(vis));for (int k=0; k<n; k++) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if ( i!=j && j!=k && i!=k ) { if ( path[i][j]==path[i][k]+path[k][j] && !vis[i][j]) { vis[i][j]=1; ans++; //break; } if ( path[i][j]>path[i][k]+path[k][j] ) return -1; } } } } return ans;}int main(){ int T, k; scanf("%d", &T); for (k=1; k<=T; k++) { scanf("%d", &n); for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { scanf("%d", &path[i][j]); } } int ans=floyd(); printf("Case %d: ", k); if ( ans==-1 ) { printf("impossible\n"); } else { printf("%d\n", n*(n-1)-ans); } } //system("pause"); return 0;}
- hdu4034 逆向算
- HDU4034-Graph
- 逆向
- 逆向
- 逆向
- 逆向-360逆向writeup
- 逆向工程
- 逆向思考
- 逆向ring0msg
- 逆向思维
- 逆向工程
- 逆向COM
- 逆向思维
- 逆向分词
- 逆向IopAttachDeviceToDeviceStackSafe
- 逆向学习
- 逆向工程
- 逆向法则
- You are using safe update mode and you tried to update a table……
- 获取DLL的模块的句柄的简单方法
- Mysql 查看数据库连接数
- iOS多线程开发指南
- 程序员困境:底层编码能力正逐步丧失
- hdu4034 逆向算
- Oracle 数据的安装步骤
- C# WINFORM 上传图片 并保存在程序的根目录的某个文件夹中
- Android开发之网络状态检测
- 判断ip类型
- MAC:制作一个OS X 10.8美洲狮安装U盘
- 正则表达式删除代码注释
- java的ClassLoader、反射、spring(待总结)
- delphi txt 文件操作