//邻接矩阵和邻接表的dfs算法
#include <iostream>
#include <stdio.h>
using namespace std;
#define INF 1000000
#define MAXL 100
#define MAXV 100
//图的邻接矩阵类型的声明
typedef struct{
int no;//顶点编号
char data[MAXL];//顶点其他信息
}VertexType;
typedef struct{
int edges[MAXV][MAXV];
int n,e;//顶点数,边数
VertexType vexs[MAXV];//存放顶点信息
}MGraph;
//建立邻接矩阵
void GreatGraph(MGraph& g, int A[][MAXV], int n, int e)
{
int i, j;
g.n = n;
g.e = e;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
g.edges[i][j] = A[i][j];
}
void DestryGraph(MGraph g)
{
}
void DFS(MGraph g,int v,int visited[MAXV])
{
int w;
cout<<v<<" ";
visited[v]=1;
for(w=0;w<g.n;w++)
if(g.edges[v][w]!=0&&g.edges[v][w]!=INF&&visited[w]==0)
DFS(g,w,visited);
}
int main()
{
MGraph g;
int visited[MAXV];
int v = 0;
int n = 7, e = 12, i;
int A[MAXV][MAXV] = { {0,2,5,3,INF,INF,INF},
{INF,0,2,INF,INF,5,INF},{INF,INF,0,1,3,8,INF},
{0,INF,INF,0,9,INF,INF},{INF,7,INF,INF,0,3,9},
{INF,INF,4,INF,INF,0,5},{INF,INF,INF,6,INF,INF,0} };
GreatGraph(g, A, n, e);
for (i = 0; i < g.n; i++) visited[i] = 0;
cout << "邻接矩阵的深度优先" << endl;
DFS(g, v, visited);
cout << endl;
DestryGraph(g);
}
//邻接矩阵的floyd算法
#include <iostream>
#include <stdio.h>
using namespace std;
#define INF 1000000
#define MAXL 100
#define MAXV 100
//图的邻接矩阵类型的声明
typedef struct{
int no;//顶点编号
char data[MAXL];//顶点其他信息
}VertexType;
typedef struct{
int edges[MAXV][MAXV];
int n,e;//顶点数,边数
VertexType vexs[MAXV];//存放顶点信息
}MGraph;
//建立邻接矩阵
void GreatGraph(MGraph& g, int A[][MAXV], int n, int e)
{
int i, j;
g.n = n;
g.e = e;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
g.edges[i][j] = A[i][j];
}
void DestryGraph(MGraph g)
{
}
void DisAllPath1(MGraph g, int A[][MAXV], int path[][MAXV])
{
int i, j, k, s;
int apath[MAXV], d;
for (i = 0; i < g.n; i++)
for (j = 0; j < g.n; j++)
{
if (A[i][j] != INF && i != j)
{
printf("从%d到%d最短路径长度为:%d 路径:", i, j, A[i][j]);
k = path[i][j];
d = 0;
apath[d] = j;
while (k != -1 && k != i)
{
d++;
apath[d] = k;
k = path[i][k];
}
d++;
apath[d] = i;
printf("%d", apath[d]);
for (s = d - 1; s >= 0; s--)
printf("->%d", apath[s]);
cout<<endl;
}
}
}
void Floyd(MGraph g)
{
int A[MAXV][MAXV],path[MAXV][MAXV];
int i,j,k;
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
{
A[i][j]=g.edges[i][j];
if(i!=j&&g.edges[i][j]<INF)
path[i][j]=i;
else
path[i][j]=-1;
}
for(k=0;k<g.n;k++)
{
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
if(A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=path[k][j];
}
}
DisAllPath1(g, A, path);
}
int main()
{
MGraph g;
int v = 0;
int n = 7, e = 12, i;
int A[MAXV][MAXV] = { {0,2,5,3,INF,INF,INF},
{INF,0,2,INF,INF,5,INF},{INF,INF,0,1,3,8,INF},
{INF,INF,INF,0,5,INF,INF},{INF,INF,INF,INF,0,3,9},
{INF,INF,INF,INF,INF,0,5},{INF,INF,INF,INF,INF,INF,0} };
GreatGraph(g, A, n, e);
cout<<"floyd"<<endl;
Floyd(g);
cout << endl;
DestryGraph(g);
}
//回溯法求解0/1背包问题
#include <stdio.h>
#define MAXN 20
int n=4;//4种物品
int W=6;//限制重量为6
int w[]={0, 5, 3, 2, 1};
int v[]={0, 4, 4, 3, 1};
int x[MAXN];
int maxv=0;//存放最优解的总价值
void dfs(int i,int tw,int tv,int op[])
{
if(i>n)
{
if(tw==W && tv>maxv)
{
maxv=tv;
for(int j=1;j<=n;j++)
x[j]=op[j];
}
}
else
{
op[i]=1;
dfs(i+1,tw+w[i],tv+v[i],op);
op[i]=0;
dfs(i+1,tw,tv,op);
}
printf("%d",tw);
}
//void dispasolution()
int main()
{
int op[MAXN];
dfs(1, 0, 0, op);
//dispasolution();
}