카테고리 없음

양방향 최단 경로

allstar94 2019. 12. 11. 01:52
#pragma warning(disable:4996)
#include 
#include 
#include 

#define INF 30000
#define TRUE 1
#define FALSE 0
int n;
int m;
int s;
int **weight;
int *distance;
int *found;

void input()
{
	int x, y, value;
	for (int i = 0; i < m; i++)
	{
		scanf("%d %d %d", &x, &y, &value);
		weight[x][y] = value;
		weight[y][x] = value;
	}
	for (int i = 1; i < n; i++)
	{
		weight[i][i] = 0;
	}
}

int choose(int n)
{
	//현재 distance 배열에서 가장 작은 가중치 값이 위치하고 있는 
	//배열의 인덱스를 찾아 반환하는 함수
	int i, min, minpos;
	min = INF;
	minpos = 0;

	for (int i = 0; i < n; i++)
	{
		if (distance[i] < min && found[i] == FALSE)
		{
			min = distance[i];

			minpos = i;
		}
	}
	return minpos;
}
void shortest_path(int start, int n)
{
	int u;
	for (int i = 1; i < n; i++)
	{
		distance[i] = weight[start][i];
		found[i] = FALSE;
	}
	found[start] = TRUE;
	distance[start] = TRUE;

	for (int i = 1; i < n - 1; i++)
	{
		u = choose(n);
		found[u] = TRUE;
		for (int w = 1; w < n; w++)
		{
			if (distance[u] + weight[u][w] < distance[w])
			{
				distance[w] = distance[u] + weight[u][w];
			}
		}
	}
}
void main()
{
	scanf("%d %d %d", &n, &m, &s);
	n++;
	weight = (int**)malloc(sizeof(int*) * (n));
	distance = (int*)malloc(sizeof(int)*n);
	found = (int*)malloc(sizeof(int)*n);

	for (int i = 0; i < n; i++)
	{
		weight[i] = (int)malloc(sizeof(int) * (n));
	}
	for (int i = 0; i < n; i++)
	{
		distance[i] = INF;
		for (int j = 0; j < n; j++)
		{
			weight[i][j] = INF;
		}
	}

	input(s);
	shortest_path(s, n);
	
	for (int i = 1; i < n; i++)
	{
		if (i != s && distance[i] != INF)
		{
			printf("%d %d\n", i, distance[i]);
		}
	}




	//free 선언
	for (int i = 0; i < n; i++)
	{
		free(weight[i]);
	}
	free(weight);
	free(distance);
	free(found);
}