C++實現弗洛伊德算法

還沒有正兒八經的獨立實現過一個什麼算法呢,以前寫的時候總是把別人的程序放在旁邊,自己寫的時候時不時瞄兩眼,最終覺得是自己寫出來的,但是時間一久就又忘記怎麼實現的了,其實這是沒有真正的理解算法,要是理解了,再加上語言功底可以就很容易去實現它。歸根到底寫不出來還是沒有真正的搞懂,

主函數:

// Frod.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "matrix.h"


int _tmain(int argc, _TCHAR* argv[])
{
	//1初始化圖矩陣u和路徑矩陣s
	//圖矩陣//
	Matrix u("input.txt");
    cout<<"-------------------------------------------------------------------"<<endl;
	//路徑矩陣//
	Matrix s(u.getRow(),u.getCol());
	s.initS();
	//2 更新圖矩陣//
	for(int k=1;k<=u.getCol();k++)
		{	for (int i=1;i<=u.getCol();i++)
			{
				for (int j=1;j<=u.getCol();j++)
				{
					int temp =u.vistElem(i,k)+u.vistElem(k,j);
					    if (temp >Infinate&&i!=j)
					    {
							temp =Infinate;
					    }
					if(u.vistElem(i,j)>temp)
					{
					  u.setElem(i,j,temp);
					  s.setElem(i,j,s.vistElem(i,k));
					}
				}
			}
	    }
	//3結束輸出
	cout<<"-------------------------------------------------------------------"<<endl;
	u.outPutElem();
	cout<<"-------------------------------------------------------------------"<<endl;
	s.outPutElem();
	cout<<"-------------------------------------------------------------------"<<endl;
	return 0;

}
圖的數據結構頭文件

#ifndef _MY_MATRIX_201419
#define _MY_MATRIX_201419

#include <string>
#include <iostream>
#include <cstdlib>

#define  Infinate 999999

using namespace std;
//元素行列從開始//
class Matrix
{
public:
	Matrix(int row,int col);
	Matrix(string path );
	void setRow(int row);
	void setCol(int col);
	int getRow(){return m_rows;}
	int getCol(){return m_cols;}
	int vistElem(int i,int j);
	void  setElem(int i,int j,int e);
	void initS();
	void outPutElem();
private:
	int m_rows;
	int m_cols;
	int num_of_edge;
	int* m_data;
public:
	virtual ~Matrix();
	
};
#endif
類的具體實現
#include "stdafx.h"
#include"matrix.h"
Matrix::Matrix(int row,int col):m_rows(row),m_cols(col)
{
	m_data =new int[row*col];

}
Matrix:: Matrix(string path )
{
	//用數據文件構造;
	 freopen(path.c_str(),"r",stdin);
	 
	 cin>>m_rows;
	 cin>>m_cols;
	 cin>>num_of_edge;

	  m_data =new int[m_rows*m_cols];

	 for (int i=0;i<m_rows;i++)
	 {
		 for (int j=0;j<m_cols;j++ )
		 {  if(i!=j)
		     {*(m_data+(i)*m_cols+(j))=Infinate;}
		    else
             {*(m_data+(i)*m_cols+(j))=0;}
		 }
	 }

	 int p ,q,weight;
	 for (int i=0;i<m_rows;i++)
	 {
		 for (int j=0;j<m_rows;j++ )
		 {
			 cin>>p>>q>>weight;
				 setElem(p,q,weight);//p指向q//
				// setElem(q,p,weight);//q指向p;表示無向圖;
		 }
	 }

	 for(int i=1; i<=m_rows; ++i)
	 {
		 for(int j=1; j<=m_rows; ++j)
			 printf("%7d", vistElem(i,j));
		 printf("\n");
	 }
}
void Matrix:: setRow(int row)
{
	m_rows=row;
}
void Matrix:: setCol(int col)
{
	m_cols =col;
}

int Matrix:: vistElem(int i,int j)
{
  
   return *(m_data+(i-1)*m_cols+(j-1));
}

void Matrix:: setElem(int i,int j,int e)
{
	*(m_data+(i-1)*m_cols+(j-1))=e;
}

void Matrix:: initS()
{
    for (int i=0;i<m_rows;i++)
    {
		for (int j=0;j<m_rows;j++)
		{
			setElem(i+1,j+1,j+1);
		}
    }

	for(int i=1; i<=m_rows; ++i)
	{
		for(int j=1; j<=m_rows; ++j)
			printf("%7d", vistElem(i,j));
		printf("\n");
	}
}
void Matrix::outPutElem()
{
	for(int i=1; i<=m_rows; ++i)
	{
		for(int j=1; j<=m_rows; ++j)
			printf("%7d", vistElem(i,j));
		printf("\n");
	}
}
Matrix:: ~Matrix()
{
  delete []m_data;
}


發佈了52 篇原創文章 · 獲贊 18 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章