UVa 125

来源:互联网 发布:splay tree java 编辑:程序博客网 时间:2024/05/16 01:44

題目:已知一些單向道路,求個城市間的路徑有多少種,存在環衛-1(無窮)。

分析:圖論、最短路。利用floyd算法求出路徑條數,然後判斷無窮。

            如果從a城市可以到達b城市,並且從b城市也可以到達a城市,則存在環;

            再利用floyd更新所有存在環的路徑。

說明:吐槽一下沒有給節點數目(⊙o⊙)…

#include <stdio.h>#include <stdlib.h>#include <string.h>int matrix[505][505];int main(){int n, u, v, cases = 0;while (~scanf("%d",&n)) {memset(matrix, 0, sizeof(matrix));int max = 0;for (int i = 0; i < n; ++ i) {scanf("%d%d",&u,&v);matrix[u][v] = 1;if (max < u) {max = u;}if (max < v) {max = v;}}// floydfor (int k = 0; k <= max; ++ k) {for (int i = 0; i <= max; ++ i) {for (int j = 0; j <= max; ++ j) {matrix[i][j] += matrix[i][k]*matrix[k][j];}}}// get -1for (int i = 0; i <= max; ++ i) {for (int j = 0; j < i; ++ j) {if (matrix[i][j] > 0 && matrix[j][i] > 0) {matrix[i][j] = -1;matrix[j][i] = -1;}}}// floydfor (int k = 0; k <= max; ++ k) {for (int i = 0; i <= max; ++ i) {for (int j = 0; j <= max; ++ j) {if (matrix[i][k] == -1 && matrix[k][j] != 0) {matrix[i][j] = -1;}if (matrix[i][k] != 0 && matrix[k][j] == -1) {matrix[i][j] = -1;}}}}printf("matrix for city %d\n",cases ++);for (int i = 0; i <= max; ++ i) {printf("%d",matrix[i][0]);for (int j = 1; j <= max; ++ j) {printf(" %d",matrix[i][j]);}printf("\n");}}return 0;}


0 0
原创粉丝点击