uva125(floyd)

题目的意思就是给出有几条单向路,然后每条路是从哪到哪.

问任意两座城市有几种路线.(城市的数量要根据输入的边来出现,就是输入边时出现的最大的那个,就是城市数量)

如果有无数种路那么就输出-1.

i 到 j 有无数种路,说明从i 到 j 经过某一个点,而这个点是属于一个环的.

例如1 到 4 有边的是1 - 2 , 2 - 3 , 3 - 2 ,3 - 4;

那么1到4 就可以1-2-3-2-3-2-3-2.....-3-4;

所以首先是用floyd的变形求出任意两点的录得数量.

其中的松弛操作是

if(g[i][k] && g[k][j]) {
					g[i][j] += g[i][k] * g[k][j];
				}

那么如果g[k][k] != 0 ;说明k点属于环中的点,那么所有经过k的都变成-1.


AC代码:


#include<stdio.h>
#include<string.h>
const int N = 35;
int g[N][N];
int n;
int m;
void floyd () {
	for (int k = 0 ; k <= m ;k++) {
		for (int i = 0  ; i <= m ;i++) {
			for (int j = 0 ; j <= m ;j++) {
				if(g[i][k] && g[k][j]) {
					g[i][j] += g[i][k] * g[k][j];
				}
			}
		}
	}
	for (int k = 0 ; k <= m ;k++) {
		if (g[k][k]) {
			g[k][k] = -1;
			for (int i = 0 ; i <= m ;i++) {
				for (int j = 0 ; j <= m ;j++) {
					if (g[i][k] && g[k][j]) 
						g[i][j] = -1;
				}
			}
		}
	}
	for (int i = 0 ; i <= m ;i++) {
		for (int j = 0 ; j <= m ;j++) {
			if (j != 0)
				printf(" ");
			printf("%d",g[i][j]);
		}
		printf("\n");
	}
}
int main () {
	int t = 0;
	int a,b;
	while(scanf("%d",&n) != EOF) {
		m = 0;
		memset(g, 0 ,sizeof(g));
		for (int i = 0 ; i < n ;i++) {
			scanf("%d%d",&a,&b);
			int temp = a > b ? a : b;
			m = temp > m ? temp : m;
			g[a][b] = 1;
		}
		printf("matrix for city %d\n",t++);
		floyd();
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值