经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
懒癌晚期学图论的时候自己用C语言写了个求可达性矩阵的算法~
来源:cnblogs  作者:return_false  时间:2018/11/6 22:10:00  对本文有异议

可达性矩阵算法~

直接上代码

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. #define n 5
  5. void print(int a[n][n]);
  6. void print1(int a[n][n]);
  7. void multiply(int a[n][n],int b[n][n],int c[n][n]);
  8. void add(int a[n][n],int b[n][n]);
  9. int main(){
  10. int a[n][n],b[n][n],c[n][n],d[n][n];
  11. for(int i = 0;i<n;++i){
  12. for(int j = 0;j<n;++j){
  13. cin>>a[i][j];
  14. b[i][j] = a[i][j];
  15. d[i][j] = a[i][j];
  16. }
  17. }cout<<"A:"<<endl;
  18. print(a);
  19. for(int i = 0;i<n-1;i++){
  20. cout<<"A"<<i+2<<":"<<endl;
  21. if(i%2){
  22. memset(a,0,sizeof(a));
  23. multiply(c,b,a);
  24. add(d,a);
  25. print(a);
  26. }else{
  27. memset(c,false,sizeof(c));
  28. multiply(a,b,c);
  29. add(d,c);
  30. print(c);
  31. }
  32. }
  33. cout<<"R:"<<endl;
  34. print(d);
  35. cout<<"P:"<<endl;
  36. print1(d);
  37. }
  38. void multiply(int a[n][n],int b[n][n],int c[n][n]){
  39. for(int i = 0;i<n;++i){
  40. for(int j = 0;j<n;++j){
  41. for(int k = 0;k<n;++k){
  42. c[i][j] = c[i][j]+(a[i][k]*b[k][j]);
  43. }
  44. }
  45. }
  46. }void print(int a[n][n]){
  47. for(int i = 0;i<n;++i){
  48. for(int j = 0;j<n;++j){
  49. cout<<a[i][j]<<(j<n-1?" ":"");
  50. }cout<<endl;
  51. }
  52. }
  53. void add(int a[n][n],int b[n][n]){
  54. for(int i=0;i<n;++i){
  55. for(int j=0;j<n;++j){
  56. a[i][j]=a[i][j]+b[i][j];
  57. }
  58. }
  59. }void print1(int a[n][n]){
  60. for(int i = 0;i<n;++i){
  61. for(int j = 0;j<n;++j){
  62. cout<<(a[i][j]?1:0)<<(j<n-1?" ":"");
  63. }cout<<endl;
  64. }
  65. }

结果图

布尔型

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. #define n 5
  5. void print(bool a[n][n]);
  6. void multiply(bool a[n][n],bool b[n][n],bool c[n][n]);
  7. void add(bool a[n][n],bool b[n][n]);
  8. int main(){
  9. bool a[n][n],b[n][n],c[n][n],d[n][n];
  10. for(int i = 0;i<n;++i){
  11. for(int j = 0;j<n;++j){
  12. cin>>a[i][j];
  13. b[i][j] = a[i][j];
  14. d[i][j] = a[i][j];
  15. }
  16. }cout<<"A:"<<endl;
  17. print(a);
  18. for(int i = 0;i<n-1;i++){
  19. cout<<"A"<<i+2<<":"<<endl;
  20. if(i%2){
  21. memset(a,false,sizeof(a));
  22. multiply(c,b,a);
  23. add(d,a);
  24. print(a);
  25. }else{
  26. memset(c,false,sizeof(c));
  27. multiply(a,b,c);
  28. add(d,c);
  29. print(c);
  30. }
  31. }
  32. cout<<"P:"<<endl;
  33. print(d);
  34. }
  35. void multiply(bool a[n][n],bool b[n][n],bool c[n][n]){
  36. for(int i = 0;i<n;++i){
  37. for(int j = 0;j<n;++j){
  38. for(int k = 0;k<n;++k){
  39. c[i][j] = c[i][j]||(a[i][k]&&b[k][j]);
  40. }
  41. }
  42. }
  43. }void print(bool a[n][n]){
  44. for(int i = 0;i<n;++i){
  45. for(int j = 0;j<n;++j){
  46. cout<<a[i][j]<<(j<n-1?" ":"");
  47. }cout<<endl;
  48. }
  49. }
  50. void add(bool a[n][n],bool b[n][n]){
  51. for(int i=0;i<n;++i){
  52. for(int j=0;j<n;++j){
  53. a[i][j]=a[i][j]||b[i][j];
  54. }
  55. }
  56. }

其实就是把乘和加的地方改一改就好了!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号