日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

旅行售貨員問題

1.問題描述:

旅行售貨員問題又稱TSP問題,問題如下:某售貨員要到若干個城市推銷商品,已知各城市之間的路程(或旅費),他要選定一條從駐地出發,經過每個城市一遍最后回到駐地的路線,使總的路線(或總的旅費)最小。數學模型為給定一個無向圖,求遍歷每一個頂點一次且僅一次的一條回路,最后回到起點的最小花費。

2.輸入要求:

輸入的第一行為測試樣例的個數T( T < 120 ),接下來有T個測試樣例。每個測試樣例的第一行是無向圖的頂點數n、邊數m( n < 12,m < 100 ),接下來m行,每行三個整數u、v和w,表示頂點u和v之間有一條權值為w的邊相連。( 1 <= u < v <= n,w <= 1000 )。假設起點(駐地)為1號頂點。

3.輸出要求:

對應每個測試樣例輸出一行,格式為"Case #: W",其中'#'表示第幾個測試樣例(從1開始計),W為TSP問題的最優解,如果找不到可行方案則輸出-1。

4.樣例輸入:

2

5 8

1 2 5

1 4 7

1 5 9

2 3 10

2 4 3

2 5 6

3 4 8

4 5 4

3 1

1 2 10

5.樣例輸出:

Case 1: 36

Case 2: -1

6.解決方法:

//旅行售貨員問題 (回溯)

#include

#define N 100

using namespace std;

int n,m,w, //圖的頂點數和邊數

graph[N][N], //圖的加權鄰接矩陣

c=0, //當前費用

bestc=-1, //當前最優值

x[N], //當前解

bestx[N]; //當前最優解

void backtrack(int k);

void swap(int &a,int &b);

void swap(int &a,int &b)

{

int temp=a;

a=b;

b=temp;

}

void backtrack(int k)

{

if(k==n)

{

if( (c+graph[x[n-1]][x[n]]+graph[x[n]][1]

{

bestc=c+graph[x[n-1]][x[n]]+graph[x[n]][1];

for(int i=1;i<=n;i++)

{

bestx[i]=x[i];

}

}

return ;

}

else

{

for(int i=k;i<=n;i++)

{

if( graph[x[k-1]][x[i]]!=-1 && (c+graph[x[k-1]][x[i]]

{

swap(x[i],x[k]);

c+=graph[x[k-1]][x[k]];

backtrack(k+1);

c-=graph[x[k-1]][x[k]];

swap(x[i],x[k]);

}

}

}

}

int main(void)

{

int i,j,tmp=1,testNum;

cin>>testNum;

while(tmp<=testNum)

{

cin>>n>>m;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

graph[i][j]=-1;

for(int k=1;k<=m;k++)

{

cin>>i>>j>>w;

graph[i][j]=w;

graph[j][i]=w;

}

for(i=1;i<=n;i++)

{

x[i]=i;

bestx[i]=i;

}

backtrack(2);

cout<

bestc=-1;

c=0;

tmp++;

}

return 0;

}

圖的m著色問題

1.問題描述給定無向連通圖G和m種不同的顏色。用這些顏色為圖G的各頂點著色,每個頂點著一種顏色。是否有一種著色法使G中每條邊的2個頂點著不同顏色,求有多少種方法為圖可m著色。

2.輸入要求:輸入的第一個為測試樣例的個數T ( T < 120 ),接下來有T個測試樣例。每個測試樣例的第一行是頂點數n、邊數M和可用顏色數m( n <= 10,M < 100,m <= 7 ),接下來M行,每行兩個整數u和v,表示頂點u和v之間有一條邊相連。( 1 <= u < v <= n )。

3.輸出要求:對應每個測試樣例輸出兩行,第一行格式為"Case #: W",其中'#'表示第幾個測試樣例(從1開始計),W為可m著色方案數。

4.樣例輸入:

1

5 8 5

1 2

1 3

1 4

2 3

2 4

2 5

3 4

4 5

5.樣例輸出:

Case 1: 360

6.解決方法:

#include

using namespace std;

#define N 100

int m,n,M,a[N][N],x[N],textNum;

int static sum=0;

bool ok(int k)

{

for(int j=1;j<=n;j++)

if(a[k][j]&&(x[j]==x[k]))

return false;

return true;

}

void backtrack(int t)

{

if(t>n)

{

sum++;

// for(int i=1;i<=n;i++)

//cout<

//cout<

}

else

for(int i=1;i<=m;i++)

{

x[t]=i;

if(ok(t))

backtrack(t+1);

x[t]=0;

}

}

int main()

{

int i,j,z=1;

cin>>textNum; //輸入測試個數

while(textNum>0)

{

cin>>n; //輸入頂點個數

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

a[i][j]=0;

cin>>M>>m; //輸入邊的個數、可用顏色數

for(int k=1;k<=M;k++) //生成圖的鄰接矩陣

{

cin>>i>>j;

a[i][j]=1;

a[j][i]=1;

}

/* for(i=1;i<=n;i++){

for(j=1;j<=n;j++)

cout<

cout<

for(i=0;i<=n;i++)

x[i]=0;

backtrack(1);

cout<

sum=0;

textNum--;

z++;

}

return 0;

}

總結

以上是生活随笔為你收集整理的java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。