#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define N 4 // Number of cities
int finalPath[N + 1];
int visited[N];
int finalRes = INT_MAX;
// Copy current path to final path
void copyToFinal(int currPath[]) {
for (int i = 0; i < N; i++)
finalPath[i] = currPath[i];
finalPath[N] = currPath[0];
}
// Find minimum edge cost from city i
int firstMin(int graph[N][N], int i) {
int min = INT_MAX;
for (int k = 0; k < N; k++)
if (graph[i][k] < min && i != k)
min = graph[i][k];
return min;
}
// Find second minimum edge cost from city i
int secondMin(int graph[N][N], int i) {
int first = INT_MAX, second = INT_MAX;
for (int j = 0; j < N; j++) {
if (i == j)
continue;
if (graph[i][j] <= first) {
second = first;
first = graph[i][j];
} else if (graph[i][j] <= second && graph[i][j] != first)
second = graph[i][j];
}
return second;
}
// TSP Recursive function using Branch and Bound
void TSPRec(int graph[N][N], int currBound, int currWeight, int level, int currPath[]) {
if (level == N) {
if (graph[currPath[level - 1]][currPath[0]] != 0) {
int currRes = currWeight + graph[currPath[level - 1]][currPath[0]];
if (currRes < finalRes) {
copyToFinal(currPath);
finalRes = currRes;
}
}
return;
}
for (int i = 0; i < N; i++) {
if (graph[currPath[level - 1]][i] != 0 && visited[i] == 0) {
int temp = currBound;
currWeight += graph[currPath[level - 1]][i];
if (level == 1)
currBound -= ((firstMin(graph, currPath[level - 1]) + firstMin(graph, i)) / 2);
else
currBound -= ((secondMin(graph, currPath[level - 1]) + firstMin(graph, i)) / 2);
if (currBound + currWeight < finalRes) {
currPath[level] = i;
visited[i] = 1;
TSPRec(graph, currBound, currWeight, level + 1, currPath);
}
currWeight -= graph[currPath[level - 1]][i];
currBound = temp;
for (int j = 0; j < N; j++)
visited[j] = 0;
for (int j = 0; j <= level - 1; j++)
visited[currPath[j]] = 1;
}
}
}
// Function to solve TSP
void TSP(int graph[N][N]) {
int currPath[N + 1];
int currBound = 0;
for (int i = 0; i < N; i++) {
currBound += (firstMin(graph, i) + secondMin(graph, i));
}
currBound = (currBound & 1) ? currBound / 2 + 1 : currBound / 2;
visited[0] = 1;
currPath[0] = 0;
TSPRec(graph, currBound, 0, 1, currPath);
}
// Main function
int main() {
int graph[N][N] = {
{0, 10, 15, 20},
{10, 0, 35, 25},
{15, 35, 0, 30},
{20, 25, 30, 0}
};
TSP(graph);
printf("Minimum cost: %d\n", finalRes);
printf("Path Taken: ");
for (int i = 0; i <= N; i++)
printf("%d ", finalPath[i]);
printf("\n");
return 0;
}
Comments
Post a Comment