[프로그래밍 연습] TSP 문제와 최단 경로
5433 단어 코드 연습
#include
#include
#include
using namespace std;
#define maxx 9999
int l[maxx][maxx];//
int n;//
int min_l = maxx;//
int sum[maxx];//
int go_city;// go_city
int visited[maxx]; // i :visited[i]=1; visited[i]=0;
int path_index = 1; // 。
int path[maxx][maxx];//
int route = 0;//
int recursion(int index)
{
if(path_index != n)
{
for(int i=1;i <= n;i++)
{
if(visited[i] == 0)
{
visited[i] = 1;
path[route][path_index] = index;
path_index++;
recursion(i);
//
path_index--;
visited[i] = 0;
}
}
}
else
{
// ( )
path[route][path_index] = index;
path[route][path_index + 1] = go_city;
// ,
printf(" %d :
",route+1);
sum[route] = 0;
for(int i=1;i<=n;i++)
{
sum[route] += l[ path[route][i] ][ path[route][i+1] ];
cout << path[route][i] << " --> ";
// route+1 ,path[route][i] , 。
path[route+1][i] = path[route][i];
}
if(min_l > sum[route])
{
min_l = sum[route];
}
cout << path[route][n+1] << endl;
cout << " : " << sum[route] << endl;
route++;
}
return 0;
}
int main()
{
memset(visited,0,sizeof(visited));
cout << " :";
cin >> n;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
printf(" %d %d :",i,j);
cin >> l[i][j];
l[j][i] = l[i][j];
}
}
cout << " :";
cin >> go_city;
visited[go_city] = 1;
recursion(go_city);
cout << " : ";
cout << min_l << endl;
return 0;
}
동적 기획법
#include
#include
#include
#define maxx 10000
using namespace std;
int n;//
int l[maxx][maxx];//
int dp[maxx][maxx];//dp
int menthod()
{
//
for (int i = 0; i < n; i++)
{
dp[i][0] = l[i][0];
}
//
for (int j = 1; j < 1 << (n - 1); j++)
{
for (int i = 0; i < n; i++)
{
dp[i][j] = 0x7ffff; //
// j, , continue
if (j >> (i - 1) & 1)
{
continue;
}
for (int k = 1; k < n; k++)
{
// k , k continue
if ((j >> (k - 1) & 1) == 0)
{
continue;
}
// dp[i][j] ,(l[i][k] + dp[k][j ^ (1 << (k - 1))
if (dp[i][j] > (l[i][k] + dp[k][j ^ (1 << (k - 1))]))
{
dp[i][j] = l[i][k] + dp[k][j ^ (1 << (k - 1))];
}
}
}
}
return 0;
}
int main()
{
memset(dp, 0, sizeof(dp));
cout << " :";
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
printf(" %d %d :", i, j);
cin >> l[i][j];
l[j][i] = l[i][j];
}
}
menthod();
cout << " : " << dp[0][(1 << (n - 1))-1] << endl;
return 0;
}
TSP 문제를 해결하는 유전 알고리즘도 있습니다. 자세한 내용은 이 블로그를 참조하십시오.https://blog.csdn.net/weixin_44611644/article/details/95016984
최단 경로 문제 (1) 모든 점에서 점까지의 원리: 가장자리를 느슨하게 하고 v1에서 v3까지의 거리가 v1에서 v2+v2에서 v3보다 크면 v1-v3의 최소값을 업데이트합니다.즉, v1에서 v3까지의 거리는 v2라는 점을 통해 업데이트할 수 있다.Floyd:
int i,j,k;
for(k=0;k
o (n^3) 모든 결점 사이의 가장 짧은 경로 길이를 얻을 수 있습니다.핵심 코드는 위와 같습니다. 인접 행렬의 초기화와 초기 값의 대수 문제를 주의하십시오.
단원 최단로 - 디제스트라는 모두 n개의 점을 가정하면 점 x에서 나머지 n-1개의 최단로를 구할 수 있다.원리가 유사하다.현재 점에서 가장 가까운 점을 꺼낼 때마다 인접점을 이용하여 디스 그룹을 업데이트합니다.최종적으로 디스 그룹이 저장한 값은 결점 0에서 나머지 결점까지의 가장 짧은 거리를 대표한다.
#include
#include
#include
using namespace std;
const int MAX=0x3f3f3f3f;
int map[110][110];
int dis[110];
int visit[110];
/*
:map , map[1][2]=3, 1 2 3
dis , dis[3]=5, 3 5
visit 0 1,1 。
*/
int n,m;
int dijkstra()
{
int i,j,pos=1,min,sum=0;
memset(visit,0,sizeof(visit));// 0,
for(i=1; i<=n; i++)
{
dis[i]=map[1][i];
}
visit[1]=1;
dis[1]=0;
int T=n-1;
while(T--)
{
min=MAX;
for(j=1; j<=n; j++)
{
if(visit[j]==0&&min>dis[j])
{
min=dis[j];
pos=j;
}
}
visit[pos]=1;//
for(j=1; j<=n; j++)
{
if(visit[j]==0&&dis[j]>min+map[pos][j])// dis
dis[j]=map[pos][j]+min;
}
}
return dis[n];
}
int main()
{
int i,j;
while(cin>>n>>m)//n n ,m m
{
memset(map,MAX,sizeof(map));
int a,b,c;
for(i=1; i<=m; i++)
{
cin>>a>>b>>c;
if(c
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[프로그래밍 연습] TSP 문제와 최단 경로TSP 폭력 매거법: 이 방법은 도시 개수 >8에 적합하지 않습니다.시간 복잡도 승급 상승 동적 기획법 TSP 문제를 해결하는 유전 알고리즘도 있습니다. 자세한 내용은 이 블로그를 참조하십시오.https://blog...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.