算法导论 第22章 22.1-3

#include<iostream>
using namespace std;
typedef struct Gnode
{
	int index;
	struct Gnode *next;
}Gnode;
int N,M;//N表示顶点,M表示边,有向图
int main()
{
	scanf("%d %d",&N,&M);
	int **area=new int*[N];
	int **area2=new int*[N];
	int i,j;
	for(i=0;i<N;i++)
	{
		area[i]=new int[N];
		area2[i]=new int[N];
	}
    for(i=0;i<N;i++)
		for(j=0;j<N;j++)
			area[i][j]=0;
	Gnode *G=new Gnode[N];
	Gnode *G2=new Gnode[N];
	for(i=0;i<N;i++)
	{
		G[i].index=i;
		G[i].next=NULL;
		G2[i].index=i;
		G2[i].next=NULL;
	}
	for(i=0;i<M;i++)
	{
		int a,b;
		scanf("%d %d",&a,&b);
		area[a][b]=1;
		Gnode *temp=&G[a];
		while(temp->next!=NULL)
			temp=temp->next;
		Gnode *temp2=new Gnode;
		temp2->index=b;
		temp2->next=NULL;
		temp->next=temp2;
	}
	printf("before transposition\n");
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
			printf("%d ",area[i][j]);
		printf("\n");
	}
	printf("\n");
	for(i=0;i<N;i++)
	{
		printf("%d",G[i].index);
		Gnode *temp=&G[i];
		while(temp->next!=NULL)
		{
			temp=temp->next;
			printf(" -> %d",temp->index);
		}
		printf(" -> ^\n");
	}
	printf("\nAfter transposition\n");
	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
			area2[j][i]=area[i][j];
	for(i=0;i<N;i++)
	{
		int a=G[i].index;
		int b;
		Gnode *temp=&G[i];
		while(temp->next!=NULL)
		{
			temp=temp->next;
			b=temp->index;
			Gnode *temp2=new Gnode;
			temp2->index=a;
			Gnode *temp3=&G2[b];
			while(temp3->next!=NULL)
				temp3=temp3->next;
			temp3->next=temp2;
			temp2->next=NULL;
		}
	}
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
			printf("%d ",area2[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	for(i=0;i<N;i++)
	{
		printf("%d",G2[i].index);
		Gnode *temp=&G2[i];
		while(temp->next!=NULL)
		{
			temp=temp->next;
			printf(" -> %d",temp->index);
		}
		printf(" -> ^\n");
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录(Table of Contents)   前言(Preface)   第一部分(Part I) 基础(Foundations)   第一 计算中算法的角色(The Role of Algorithms in Computing)   第二 开始(Getting Started)   第三 函数的增长率(Growth of Functions)   第四 递归(Recurrences)   第五 概率分析与随机化算法(Probabilistic Analysis and Randomized Algorithms)   第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics)   第六 堆排序(Heapsort)   第七 快速排序(Quicksort)   第八 线性时间中的排序(Sorting in Linear Time)   第九 中值与顺序统计(Medians and Order Statistics)   第三部分(Part III) 数据结构(Data Structures)   第十 基本的数据结构(Elementary Data Structures)   第十一 散列表(Hash Tables)   第十二 二叉查找树(Binary Search Trees)   第十三 红-黑树(Red-Black Trees)   第十四 扩充的数据结构(Augmenting Data Structures)   第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques)   第十五 动态规划(Dynamic Programming)   第十六 贪婪算法(Greedy Algorithms)   第十七 分摊分析(Amortized Analysis)   第五部分(Part V) 高级的数据结构(Advanced Data Structures)   第十八 B-树(B-Trees)   第十九 二项式堆(Binomial Heaps)   第二十 斐波纳契堆(Fibonacci Heaps)   第二十一 不相交集的数据结构(Data Structures for Disjoint Sets)   第六部分(Part VI) 图算法(Graph Algorithms)   第二十二 基本的图算法(Elementary Graph Algorithms)   第二十三 最小生成树(Minimum Spanning Trees)   第二十四 单源最短路径(Single-Source Shortest Paths)   第二十五 全对的最短路径(All-Pairs Shortest Paths)   第二十六 最大流(Maximum Flow)   第七部分(Part VII) 精选的主题(Selected Topics)   第二十七 排序网络(Sorting Networks)   第二十八 矩阵运算(Matrix Operations)   第二十九 线性规划(Linear Programming)   第三十 多项式与快速傅里叶变换(Polynomials and the FFT)   第三十一 数论算法(Number-Theoretic Algorithms)   第三十二 字符串匹配(String Matching) ......................................................
算法导论第1616.2-5题目描述: 证明:在所有的用于求解单源最短路径问题的算法中,Bellman-Ford算法是唯一一个能够处理权值可以是负数的图的算法。 证明如下: 首先,给定一个图G和一个源节点s,我们假设该图G中存在至少一条从源节点s到另一个节点v的路径,使得该路径上至少有一条边的权值为负数。我们的任务是要找到一条从源节点s到节点v的最短路径。 考虑Bellman-Ford算法的实现过程。该算法通过迭代更新每个节点的松弛值来找到最短路径。在算法的每一次迭代中,我们对所有的边进行一次松弛操作。如果图中存在一条从源节点s到节点v的最短路径,那么这条路径上的所有边都会被松弛,且最终计算出的节点v的最短路径长度将会是这条最短路径的长度。 现在我们考虑一种情况:假设在算法的第k次迭代中,我们已经找到了从源节点s到节点v的长度为k的最短路径。此时考虑该最短路径的最后一条边(u,v),且该边的权值为负数。由于在Bellman-Ford算法中,我们是对所有边进行松弛操作的,因此在第k+1次迭代中,我们一定会通过这条边(u,v)来进行松弛操作。此时,由于(u,v)的权值为负数,因此算法将会通过这条边来缩短v的距离值,使得v的距离值变成小于k的某个值。这就意味着我们找到了一条从源节点s到v的更短的路径,与假设矛盾。 因此,我们得出结论:在所有的用于求解单源最短路径问题的算法中,Bellman-Ford算法是唯一一个能够处理权值可以是负数的图的算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值