算法最后一次作业

//邻接矩阵和邻接表的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();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值