哈密尔顿回路 C++

来源:互联网 发布:微信html5制作软件 编辑:程序博客网 时间:2024/05/16 23:33

突然记起来我大二写了个哈密尔顿回路..于是共享之...

/**作者:hwb时间:2013.3.2-2013.3.6任务:求出全部的哈密尔顿回路完成感想:根据一个论文的算法写的,如果有高手可以提出改进的话,请发邮件到我的QQ 409169964  PS;中国的论文好多都是抄来抄去,只是名字改了...*/#include <iostream>#include <fstream>#include <string>#include <stdlib.h>#include <vector>using namespace std;struct Hami{vector<string> path;bool whether;};Hami  arr[10][10];Hami M[10][10];Hami temp[10][10];void hami(int );int main (){ifstream fin("read.txt",ios::beg);if(!fin){cout<<"can't find it)";return -1;}int row;fin>>row;string str[10][10];string input;for(int i=0;i<row;i++){for(int j=0;j<row;j++){fin>>input;if(input=="0"){str[i][j]="-1";}else{string temp,temp2;char ch[10];_itoa((i+1),ch,10);temp=ch;_itoa((j+1),ch,10);temp2=ch;str[i][j]=temp+temp2;}}}for(int i=0;i<row;i++){for(int j=0;j<row;j++){arr[i][j].path.push_back(str[i][j]);arr[i][j].whether=false;}}for(int i=0;i<row;i++){int judeg=0;for(int j=0;j<row;j++){if(arr[i][j].path[0]=="-1"){judeg++;}if(judeg==row){cout<<"没有哈密尔顿回路"<<endl;return 0;}}}for(int i=0;i<row;i++){for(int j=0;j<row;j++){if(arr[i][j].path[0]!="-1"){int length=arr[i][j].path[0].length();M[i][j].path.push_back(arr[i][j].path[0].substr(1,length));}else{M[i][j].path.push_back("-1");}M[i][j].whether=false;}}for(int i=0;i<row;i++){for(int j=0;j<row;j++){temp[i][j].whether=false;}}hami(row);fin.close();return 0;}void hami(int row){int k=1;for(k;k<row;k++){for(int i=0;i<row;i++){for(int j=0;j<row;j++){bool real=false;for(int f=0;f<row;f++){string tt="-1";const char* jj=M[f][j].path[0].c_str();if(arr[i][f].whether==false&&M[f][j].whether==false){if(arr[i][f].path[0]=="-1"||M[f][j].path[0]=="-1"){continue;}if(arr[i][f].path[0].find(M[f][j].path[0])==M[f][j].path[0].npos){tt=arr[i][f].path[0]+M[f][j].path[0];vector<string>::iterator it1=temp[i][j].path.begin();vector<string>::iterator end1;for(it1;it1!=temp[i][j].path.end();){if((*it1).length()<=k+1){it1=temp[i][j].path.erase(it1);}else{it1++;}}temp[i][j].path.push_back(tt);it1=temp[i][j].path.begin();end1=temp[i][j].path.end();int number=0;for(it1;it1!=end1;it1++){number++;}if(number>1){temp[i][j].whether=true;}else{temp[i][j].whether=false;}real=true;continue;}else if(k==(row-1)&&arr[i][f].path[0][0]==*jj){tt=arr[i][f].path[0]+M[f][j].path[0];vector<string>::iterator it1=temp[i][j].path.begin();for(it1;it1!=temp[i][j].path.end();){if((*it1).length()<=k+1){it1=temp[i][j].path.erase(it1);}else{it1++;}}temp[i][j].path.push_back(tt);vector<string>::iterator it2=temp[i][j].path.begin();vector<string>::iterator end2=temp[i][j].path.end();int number=0;for(it2;it2!=end2;it2++){number++;}if(number>1){temp[i][j].whether=true;}else{temp[i][j].whether=false;}real=true;continue;}}else if(arr[i][f].whether==true&&M[f][j].whether==false){if(M[f][j].path[0]=="-1"){continue;}vector<string>::iterator it3=arr[i][f].path.begin();for(it3;it3!=arr[i][f].path.end();it3++){if((*it3).find(M[f][j].path[0])==M[f][j].path[0].npos){tt=(*it3)+M[f][j].path[0];if(temp[i][j].path.empty()==false){vector<string>::iterator beg1=temp[i][j].path.begin();vector<string>::iterator end1=temp[i][j].path.end();for(beg1;beg1!=temp[i][j].path.end();){beg1=temp[i][j].path.erase(beg1);}}temp[i][j].path.push_back(tt);real=true;vector<string>::iterator it4=temp[i][j].path.begin();vector<string>::iterator end4=temp[i][j].path.end();int number=0;for(it4;it4!=end4;it4++){number++;}if(number>1){temp[i][j].whether=true;}else{temp[i][j].whether=false;}}else if(k==(row-1)&&(*it3)[0]==*jj){tt=(*it3)+M[f][j].path[0];temp[i][j].path.push_back(tt);real=true;vector<string>::iterator it5=temp[i][j].path.begin();vector<string>::iterator end5=temp[i][j].path.end();int number=0;for(it5;it5!=end5;it5++){number++;}if(number>1){temp[i][j].whether=true;}else{temp[i][j].whether=false;}}}}}if(real==false){if(temp[i][j].path.empty()==true){temp[i][j].path.push_back("-1");temp[i][j].whether=false;}else{vector<string>::iterator beg6=temp[i][j].path.begin();vector<string>::iterator end6=temp[i][j].path.end();temp[i][j].path.erase(beg6,end6);temp[i][j].path.push_back("-1");temp[i][j].whether=false;}}}}for(int i=0;i<row;i++){for(int j=0;j<row;j++){vector<string>::iterator beg7=arr[i][j].path.begin();vector<string>::iterator end7=arr[i][j].path.end();arr[i][j].path.erase(beg7,end7);vector<string>::iterator it7=temp[i][j].path.begin();for(it7;it7!=temp[i][j].path.end();it7++){string t=*it7;arr[i][j].path.push_back(t);if(temp[i][j].whether==true){arr[i][j].whether=true;}else{arr[i][j].whether=false;}}}}for(int i=0;i<row;i++){int judeg=0;for(int j=0;j<row;j++){if(arr[i][j].path[0]=="-1"){judeg++;}if(judeg==row){cout<<"没有哈密尔顿回路"<<endl;return ;}}}}if(k==row){cout<<"哈密尔顿回路是"<<endl;for(int i=0;i<row;i++){vector<string>::iterator it=temp[i][i].path.begin();for(it;it!=temp[i][i].path.end();it++){cout<<i<<": ";cout<<*it<<endl;}}}}


。。好久以前写的...


输出图的全部Hamiltonian回路的新算法  

可以看这篇文章,写得不错

0 0
原创粉丝点击