PDA

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



neilabak
چهارشنبه 22 اسفند 1386, 14:15 عصر
سلام
این برنامه برای گرفتن نودهای یک گراف و یه سری کار روشه ولی وقتی اجرا میکنم 13 تا erorمیده همشم مال تابع راشاله . هر چی نگاه میکنم مشکلشو نمیفهم:عصبانی++:. اگه کسی میتونه لطفا بگه چی کار کنم.
ممنون



#include <iostream.h>
#define m 10

/////////////////////////////////////////////////
class graph {
private:
int neiber[m][m];
int a[m][m];
int n;
int degrein[m];
int degreout[m];
int dist[m];
int length[m][m];
bool s[m];
int min[m][m];
int shortest[m*m];
int poosha[m][m];
public:
graph(int v)
{n=v;
}
void grapharay();
int degreeout(int );
int degreein(int v);
int* findneiber(int );
void shortestpath(int , int );
int choose();
void allength(int n);
void perim(int v[10][10], int g);
void sort(int*,int);

void rashal();
};
///////////////////////////////////////////////////////
void graph ::grapharay()
{//cout<<"enter the number of node:\n";
// cin>>n;
for(int i=0;i<n;i++)
{ for (int j=0;j<n;j++)
{cout<<"if is the way from node "<<i<<"to node "<<j<<" enter 1 else enter 0\n";
cin>>a[i][j];
if(a[i][j]==0)length[i][j]=1000;
else
{cout<<"enter lenght:\n";
cin>>length[i][j];}
}
}
};
//////////////////////////////////////////////////////
int graph ::degreeout(int v)
{ for(int i=0;i<n;i++)
degreout[v]+=a[v][i];
return degreout[v];
};
////////////////////////////////////////////////////
int graph ::degreein(int v)
{ for(int j=0;j<n;j++)
degrein[v]+=a[j][v];
return degrein[v];
};
//////////////////////////////////////////////////////
int* graph ::findneiber(int v)
{int j=0;
for(int i=0;i<n;i++)
{ if(a[v][i]==1)
{neiber[v][j]=i;
j++;
}
}
return neiber[v];
};
//////////////////////////////////////////////////////
int graph::choose()
{int j=0;
if(j<n)
return j++;
}
;
////////////////////////////////////////////////////
void graph ::shortestpath(int n, int v)
{ for(int i=0;i<n;i++)
{s[i]=false;
dist[i]=length[v][i];
}
s[v]=true;
dist[v]=0;

for(i=0;i<n-2;i++)
{int u=choose();
s[u]=true;
for(int w=0;w<n;w++)
if(!s[w])
if(dist[u]+length[u][w]<dist[w])
dist[w]=dist[u]+length[u][w];
}
};
/////////////////////////////////////////////////
void graph ::allength(int n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
min[i][j]=length[i][j];
for(int k=0;k<n;k++)
for(i=0;i<n;i++)
for(int j=0;j<n;j++)
if((min[i][k]+min[k][j])<min[i][j])min[i][j]=min[i][k]+min[k][j];
};
////////////////////////////////////////////////
void graph ::perim(int v[10][10], int g)
{
int f[10][10]={0};
int sm=100;
int i=0;
int j=0;
int y=0;
for(i=0;i<g;i++){
for(j=0;j<i;j++)
if((v[i][j]<sm) && (v[i][j]!=0)){
f[i][j]=1;
f[j][i]=1;
y++;
}
}
sm=100;
for(int k=0;k<g;k++){
if((v[i][k]<sm) && (v[i][k]!=0))
sm=v[i][k];
}
};
/////////////////////////////////////////////
void graph ::rashal()
{int poosha[n][n]={0};
/////////////////////////
for(int g=0;g<n;g++)
for(int h=0;h<n;h++)
poosha[g][h]=0;
///////////////////////////
int yal=n-1;
int d=0;
int k=0;
int *test;
for(int i=0; i<n;i++)
{ for(int j=0;j<n;j++)
{if(length[i][j]!=1000)
{test=new int;
test[k]=length[i][j];
k++;}


}

}
sort(test,k);
if(test[k]<n-1)
cout<<"derekht hamband nist\n";
else{
for(int m=0;m<yal;m++)
{for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(test[d]==length[i][j] && poosha[i][j]=0)
poosha[i][j]=1;}


}
////chp arayeh derekht poosha;
cout<<"arayeh derakhte poosha is:\n";
for(int s=0;s<n;s++)
cout<<" "<<s<<" ";
for(int a=0;a<n;a++)
{cout<<a<<" ";
for(int b=0;b<n;b++)
{cout<<poosha[a][b]<<" ";
cout<<"\n";
}
}

};
///////////////////////////////////////////////////
void graph ::sort ( int *arr , int n )
{
int i , j ;
int max , temp ;
for ( i = n - 1 ; i > 0 ; i -- )
{
max = 0 ;
for ( j = 1 ; j <= i ; j ++ )
if ( arr[ max ] < arr[ j ] )
max = j ;
temp = arr[ i ] ;
arr[ i ] = arr[ max ] ;
arr[ max ] = temp ;
}
};
/////////////////////////////////////////
void main()
{graph g(3);
g.grapharay();
cout<<"darageh voroodi 1:"<<g.degreeout(1)<<"\n";
cout<<"darajeh khorooji 2"<<g.degreeout(2)<<"\n";
cout<<g.findneiber(2);
g.shortestpath(3,0);

}

A_Salimi
چهارشنبه 22 اسفند 1386, 14:47 عصر
سلام
من مشکل رو برطرف کردم یعنی برنامه الان کار میکنه امیدوارم جوابهای نهایی درست هم باشه








#include <iostream.h>
const int m=10;
/////////////////////////////////////////////////
class graph {
private:
int neiber[m][m];
int a[m][m];
int n;
int degrein[m];
int degreout[m];
int dist[m];
int length[m][m];
bool s[m];
int min[m][m];
int shortest[m*m];
int poosha[m][m];
public:
graph(int v)
{n=v;
}
void grapharay();
int degreeout(int );
int degreein(int v);
int* findneiber(int );
void shortestpath(int , int );
int choose();
void allength(int n);
void perim(int v[10][10], int g);
void sort(int*,int);

void rashal();
};
///////////////////////////////////////////////////////
void graph ::grapharay()
{//cout<<"enter the number of node:\n";
// cin>>n;
for(int i=0;i<n;i++)
{ for (int j=0;j<n;j++)
{cout<<"if is the way from node "<<i<<"to node "<<j<<" enter 1 else enter 0\n";
cin>>a[i][j];
if(a[i][j]==0)length[i][j]=1000;
else
{cout<<"enter lenght:\n";
cin>>length[i][j];}
}
}
};
//////////////////////////////////////////////////////
int graph ::degreeout(int v)
{ for(int i=0;i<n;i++)
degreout[v]+=a[v][i];
return degreout[v];
};
////////////////////////////////////////////////////
int graph ::degreein(int v)
{ for(int j=0;j<n;j++)
degrein[v]+=a[j][v];
return degrein[v];
};
//////////////////////////////////////////////////////
int* graph ::findneiber(int v)
{int j=0;
for(int i=0;i<n;i++)
{ if(a[v][i]==1)
{neiber[v][j]=i;
j++;
}
}
return neiber[v];
};
//////////////////////////////////////////////////////
int graph::choose()
{
int j=0;
if(j<n)
return j++;
}
;
////////////////////////////////////////////////////
void graph ::shortestpath(int n, int v)
{
//*********
int i; //////////int ro bala tarif kardam
for(i=0;i<n;i++)
{s[i]=false;
dist[i]=length[v][i];
}
s[v]=true;
dist[v]=0;
for(i=0;i<n-2;i++)
{int u=choose();
s[u]=true;
for(int w=0;w<n;w++)
if(!s[w])
if(dist[u]+length[u][w]<dist[w])
dist[w]=dist[u]+length[u][w];
}
};
/////////////////////////////////////////////////
void graph ::allength(int n)
{
//********
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
min[i][j]=length[i][j];
for(int k=0;k<n;k++)
for(i=0;i<n;i++)
for(int j=0;j<n;j++)
if((min[i][k]+min[k][j])<min[i][j])min[i][j]=min[i][k]+min[k][j];
};
////////////////////////////////////////////////
void graph ::perim(int v[10][10], int g)
{
int f[10][10]={0};
int sm=100;
int i=0;
int j=0;
int y=0;
for(i=0;i<g;i++){
for(j=0;j<i;j++)
if((v[i][j]<sm) && (v[i][j]!=0)){
f[i][j]=1;
f[j][i]=1;
y++;
}
}
sm=100;
for(int k=0;k<g;k++){
if((v[i][k]<sm) && (v[i][k]!=0))
sm=v[i][k];
}
};
/////////////////////////////////////////////
void graph ::rashal()
{
//**********
/////{}
//int poosha[n][n]=0;
/////////////////////////
for(int g=0;g<n;g++)
for(int h=0;h<n;h++)
poosha[g][h]=0;
///////////////////////////
int yal=n-1;
int d=0;
int k=0;
int *test;
for(int i=0; i<n;i++)
{ for(int j=0;j<n;j++)
{if(length[i][j]!=1000)
{test=new int;
test[k]=length[i][j];
k++;}


}

}
sort(test,k);
if(test[k]<n-1)
cout<<"derekht hamband nist\n";
else{
for(int m=0;m<yal;m++)
{for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(test[d]==length[i][j] && poosha[i][j]==0) /////mosavi nazashte boodid
poosha[i][j]=1;}


}
////chp arayeh derekht poosha;
cout<<"arayeh derakhte poosha is:\n";
for(int s=0;s<n;s++)
cout<<" "<<s<<" ";
for(int a=0;a<n;a++)
{cout<<a<<" ";
for(int b=0;b<n;b++)
{cout<<poosha[a][b]<<" ";
cout<<"\n";
}
}
};
///////////////////////////////////////////////////
void graph ::sort ( int *arr , int n )
{
int i , j ;
int max , temp ;
for ( i = n - 1 ; i > 0 ; i -- )
{
max = 0 ;
for ( j = 1 ; j <= i ; j ++ )
if ( arr[ max ] < arr[ j ] )
max = j ;
temp = arr[ i ] ;
arr[ i ] = arr[ max ] ;
arr[ max ] = temp ;
}
};
/////////////////////////////////////////
void main()
{graph g(3);
g.grapharay();
cout<<"darageh voroodi 1:"<<g.degreeout(1)<<"\n";
cout<<"darajeh khorooji 2"<<g.degreeout(2)<<"\n";
cout<<g.findneiber(2);
g.shortestpath(3,0);
}