a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言使用回溯法解旅行售貨員問題與圖的m著色問題

2020-01-26 14:31:51
字體:
來源:轉載
供稿:網友

旅行售貨員問題
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.樣例輸入:

25 81 2 51 4 71 5 92 3 102 4 32 5 63 4 84 5 43 11 2 10

5.樣例輸出:

Case 1: 36Case 2: -1

6.解決方法:

//旅行售貨員問題 (回溯)#include<iostream> #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||bestc==-1) && graph[x[n-1]][x[n]]!=-1 && graph[x[n]][1]!=-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]]<bestc || bestc==-1))       {         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<<"Case "<<tmp<<": "<<bestc<<endl;    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.樣例輸入:

15 8 51 21 31 42 32 42 53 44 5

5.樣例輸出:

Case 1: 360

6.解決方法:

#include<iostream>using namespace std;#define N 100int 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<<x[i]<<" ";    //cout<<endl;  }  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<<a[i][j]<<" ";    cout<<endl;}*/    for(i=0;i<=n;i++)    x[i]=0;    backtrack(1);    cout<<"Case "<<z<<": "<<sum<<endl;    sum=0;            textNum--;    z++;  }      return 0;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 国产一区二区三区四区 | 欧美a一级 | 国产欧美日本 | 免费观看一级毛片 | 久久国产一区二区三区 | 久久九 | 久久精品国产99国产 | 91精品国产欧美一区二区 | 久久久久99精品国产片 | 国产99久久精品一区二区永久免费 | se69色成人网wwwsex | 91视频免费看 | 午夜激情视频免费 | 一区二区三区国产精品 | 制服 丝袜 综合 日韩 欧美 | 可以免费观看的av | av超碰| 成人超碰| 国内久久| 国产午夜手机精彩视频 | 国产欧美一区二区精品性色 | 二区精品 | 日韩av一区二区三区四区 | 午夜激情综合 | 一区二区三区四区在线 | 亚洲一区二区在线视频 | 亚洲偷色 | 欧美日韩电影一区二区 | 国产亚洲一区二区三区在线观看 | 国产裸体永久免费视频网站 | 精品久久久久久久久久久久久久 | 夜夜草天天干 | 精品国产一区二区三区久久久蜜月 | 国产成人8x视频一区二区 | 太平公主一级艳史播放高清 | 亚洲欧美一区二区精品中文字幕 | 国产欧精精久久久久久久 | 国产成人精品免高潮在线观看 | 精品国产福利 | 国产一区久久 | www.欧美.com|