Floyd算法

Floyd算法

思想:暴力搜索,通过三次循环不断遍历图,最终得到最短路径,适用与双源最短路
每次将一个点拿出来,然后看看遍历图,看是否能通过这个点获得更短的路径


```c
void floyd()
{
	for(int k=0;k<n;k++)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(e[i][j]>e[i][k]+e[k][j])
				e[i][j]=e[i][k]+e[k][j];
			}
		}
	}
}

例题


7-13 路由器 (30 分)
快速的信息传送已经成为必须。信息传送工作由位于网络节点上的路由器来实现。每个路由器都维护一个“路由器表”,给出它可以直接到达的路由器编号。很明显,信息传送要求经过的路由器最少(也被称为“跳数”)。对于给出的网络,要求编写程序发现从信息源到目标节点的最佳路线(最少跳数)。假定n个路由器编号为0至n-1,网络中路由器数目不超过200,且至少有2个路由器,每个路由器最多和50个路由器直接相连。

输入格式:
输入包含多组测试数据。每组数据输入第一行为整数n和m,表示网络中路由器数。接下来n行表示每个路由器可直接到达的路由器ID列表,每行为一组空格间隔的整数,格式为i k v 
1
​	
  v 
2
​	
  ... v 
k
​	
 ,其中i表示路由器编号,k为路由器i可直接到达的路由器数,接下来k个数 v 
1
​	
  v 
2
​	
  ... v 
k
​	
 表示路由器i可直接到达的路由器编号。接下来m行,表示m组查询,每行两个整数a和b,表示起始路由器和终点路由器编号。

提示:可使用EOF判断输入结束

输出格式:
对每组测试数据,输出m行,每行为信息从路由器a传送到路由器b所需经过的最小跳数,如果不可能进行信息传送(起始路由器和终点路由器不连通),则输出“connection impossible”。

输入样例:
6 2
0 5 1 2 3 4 5
1 0
2 0
3 0
4 0
5 0
0 2
1 2
4 2
0 2 1 2
1 2 2 3
2 1 3 
3 1 2
0 3
1 0
输出样例:
1
connection impossible
2
connection impossible

解题代码:

```c
#include<bits/stdc++.h>
using namespace std;

int n,m;
int e[201][201];
const int INF = 0x3f3f3f3f;
void init()
{
	for(int i=0;i<201;i++)
	{
		for(int j=0;j<201;j++)
		e[i][j]=INF;
	}
}

void floyd()
{
	for(int k=0;k<n;k++)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(e[i][j]>e[i][k]+e[k][j])
				e[i][j]=e[i][k]+e[k][j];
			}
		}
	}
}

int main()
{
	while(cin>>n>>m)
	{
		init();
		for(int i=0;i<n;i++)
		{
			int k,idx;
			cin>>idx>>k;
			while(k--)
			{
				int x;
				cin>>x;
				e[i][x]=1;
			
			}
		}
		floyd();
		for(int i=0;i<m;i++)
		{
			int a,b;
			cin>>a>>b;
			if(e[a][b]!=INF)
			{
				cout<<e[a][b]<<endl;
			}
			else cout<<"connection impossible"<<endl;
			
		}
		
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值