PDA

View Full Version : سوال: کمک در مورد سورس کد فروشنده دوره گرد به روش پویا



ali5050
دوشنبه 19 تیر 1391, 21:20 عصر
سلام دوستان
من برنامه فروشنده دوره گرد به روش پویا رو دارم حالا وقتی اجراش می کنم چند تا ارور میده لطفا کمک کنید خیلی ممنون میشم اینم برنامش
#include<iostream.h>
#include<math.h>
#include<fstream.h>
#include<conio.h>

//using namespace std;

#define N 10
#define SETCOUNT 1500

int graph[N][N];


class set{
public:
int count;//count of member
long subset;
set(){count=0;subset=0;}
set(unsigned long parsubset){subset=parsubset; count=CountOfMember();}

int CountOfMember();
int IsInSubSet( int numofmember);
set Remove( int numofmember);
};

int set::CountOfMember(){
int ret=0;

long tpar=subset;
for(;tpar;tpar=tpar>>1){
if(tpar%2){ret++;}
}
return ret;
}

int set::IsInSubSet( int numofmember){
int ret=0;

unsigned long t=(unsigned long)pow(2.0,numofmember);
if(t&subset){ret=1;}

return ret;
}
set set::Remove( int numofmember){
set ret(subset);

long t=(unsigned long)pow(2.0,numofmember);
t=~t;
ret.subset=t&subset;

return ret;
}

void travel(int W[N][N],int P[N][SETCOUNT],int numberofnode,int &minlength){

set V((int)pow(2.0, numberofnode)-1);

int i,j,k;

int D[N][SETCOUNT];//(int)pow(2.0,N-1)
for(int i=1;i<numberofnode;i++){
D[i][0]=W[i][0];
}
for(k=1;k<=numberofnode-2;k++){
for(int l=0;l<V.subset/2;l++){
set lset(l);//in lset v2 is in index 0
if(lset.count==k){
for(i=1;i<numberofnode;i++){
if(lset.IsInSubSet(i-1)){continue;}

int min=32530,tj=0;
for(j=1;j<numberofnode;j++){
if(!lset.IsInSubSet(j-1)){continue;}

int tdistance=W[i][j]+D[j][lset.Remove(j-1).subset<<1];
if(tdistance<min){min=tdistance;tj=j;}
}

int indexsub=lset.Remove(j-1).subset<<1;
D[i][indexsub]=min;
P[i][indexsub]=tj;

}
}
}
}

int min=32530,tj=0;

for(j=1;j<numberofnode;j++){

int tdistance=W[0][j]+D[j][V.Remove(0).Remove(j).subset];
if(tdistance<min){min=tdistance;tj=j;}
}
D[0][V.Remove(0).subset]=min;
P[0][V.Remove(0).subset]=tj;

minlength=D[0][V.Remove(0).subset];

}
#define N 10
void ShowMatris(int matris[N][N],int n){
for(int i=0;i<n;i++){
cout<<"\n";
for(int j=0;j<n;j++){

cout<<matris[i][j]<<" ";
}
}
cout<<"\n";
}


void main(){

int len=0;
//cout<<"enter len of graph:";
//cin>>len;
len=4;


ifstream ifile;
ifile.open("graph.txt");

ifile>>len;

for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
ifile>>graph[i][j];
}
}

ShowMatris(graph,len);
cout<<endl;


int minlength=0;
int P[N][SETCOUNT];

travel(graph,P,len,minlength);

cout<<"min length :"<<minlength<<endl;
set tset((int)pow(2.0, len)-1);
int i=0;
cout<<"v1 ";
for(;tset.count>2;){
tset=tset.Remove(i);
cout<<"v"<<(P[i][tset.subset]+1)<<" ";
i=P[i][tset.subset];
}
cout<<"v1 ";


getch();
}