Dijkstra_And_Ford

来源:互联网 发布:淘宝换手机屏幕可靠么 编辑:程序博客网 时间:2024/04/27 11:12
/* *Dijkstra And Ford *Date: 2013/3/25 *NolanJian */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <limits.h>#define MAXSIZE 1001#define TRUE 1#define FALSE 0int choose(void);void Input(void);void Dijkstra(int v);void AllCost(void);int cost[MAXSIZE][MAXSIZE], distance[MAXSIZE], distance2[MAXSIZE][MAXSIZE];short int found[MAXSIZE];int N, M;int main() {while(scanf("%d%d", &N, &M) != EOF) {Input();Dijkstra(4);AllCost();}}void AllCost(void) {int i, j, k;memset(distance2, 0, sizeof(distance2));for(i = 0; i < N; i++)for(j = 0; j < N; j++)distance2[i][j] = cost[i][j];for(k = 0; k < N; k++) for(i = 0; i < N; i++)for(j = 0; j < N; j++)if(distance2[i][k] && distance2[k][j])if(distance2[i][k] + distance2[k][j] < distance2[i][j] || distance2[i][j] == 0)distance2[i][j] = distance2[i][k] + distance2[k][j];printf("********************************************\n");for(i = 0; i < N; i++)for(j = 0; j < N; j++)if(distance2[i][j])printf("%d to %d : %d\n", i, j, distance2[i][j]);}void Input(void) {int x, y, c, i;memset(cost, 0, sizeof(cost));for(i = 0; i < M; i++) {scanf("%d%d%d", &x, &y, &c);cost[x][y] = c;}return ;}void Dijkstra(int v) {int i, u, w;for(i = 0; i < N; i++) {found[i] = FALSE;distance[i] = cost[v][i];}found[v] = TRUE;distance[v] = 0;for(i = 0; i < N - 2; i++) {u = choose();found[u] = TRUE;for(w = 0; w < N; w++)if(!found[w] && cost[u][w])if(distance[u] + cost[u][w] < distance[w] || distance[w] == 0)distance[w] = distance[u] + cost[u][w];}for(i = 0; i < N; i++)printf("%d to %d : %d\n", v, i, distance[i]);}int choose(void) {int i, min, minpos;min = INT_MAX;minpos = -1;for(i = 0; i < N; i++) if(distance[i] && distance[i] < min && !found[i]) {min = distance[i];minpos = i;}return minpos;}