最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年07月04日 16:13:24   作者:Hi_Aaron  
回溯法即是在按條件搜索走不通的情況下退回再選擇其他路線的方法,這里我們來看C語言使用回溯法解旅行售貨員問題與圖的m著色問題的方法示例:

旅行售貨員問題
1.問題描述:

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

2.輸入要求:

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

3.輸出要求:

對應(yīng)每個測試樣例輸出一行,格式為"Case #: W",其中'#'表示第幾個測試樣例(從1開始計),W為TSP問題的最優(yōu)解,如果找不到可行方案則輸出-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<iostream> 
#define N 100 
using namespace std; 
int n,m,w,      //圖的頂點數(shù)和邊數(shù)
  graph[N][N],   //圖的加權(quán)鄰接矩陣
  c=0,       //當(dāng)前費用
  bestc=-1,     //當(dāng)前最優(yōu)值
  x[N],      //當(dāng)前解
  bestx[N];    //當(dāng)前最優(yōu)解
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.輸入要求:
輸入的第一個為測試樣例的個數(shù)T ( T < 120 ),接下來有T個測試樣例。每個測試樣例的第一行是頂點數(shù)n、邊數(shù)M和可用顏色數(shù)m( n <= 10,M < 100,m <= 7 ),接下來M行,每行兩個整數(shù)u和v,表示頂點u和v之間有一條邊相連。( 1 <= u < v <= n )。

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

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<iostream>
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<<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;         //輸入測試個數(shù)
  while(textNum>0)
  {
    cin>>n;          //輸入頂點個數(shù)
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    a[i][j]=0;
    cin>>M>>m;         //輸入邊的個數(shù)、可用顏色數(shù)
    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;
}

相關(guān)文章

  • QT已有項目導(dǎo)入工程時注意事項圖文詳解

    QT已有項目導(dǎo)入工程時注意事項圖文詳解

    QT開發(fā)這幾年大大小小項目做了不少,花了點時間對知識點總結(jié)整合了一部分,下面這篇文章主要給大家介紹了關(guān)于QT已有項目導(dǎo)入工程時注意事項的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 解析Linux內(nèi)核的基本的模塊管理與時間管理操作

    解析Linux內(nèi)核的基本的模塊管理與時間管理操作

    這篇文章主要介紹了Linux內(nèi)核的基本的模塊管理與時間管理操作,包括模塊加載卸載函數(shù)的使用和定時器的用法等知識,需要的朋友可以參考下
    2016-02-02
  • 基于Qt實現(xiàn)的自定義樹結(jié)構(gòu)容器

    基于Qt實現(xiàn)的自定義樹結(jié)構(gòu)容器

    在Qt框架中,盡管其提供了許多強(qiáng)大的容器類,但缺少一個通用的、靈活的樹結(jié)構(gòu)容器,所以本文將設(shè)計并實現(xiàn)一個可復(fù)用的自定義樹結(jié)構(gòu)容器,需要的可以參考下
    2024-12-12
  • Matlab實現(xiàn)繪制高階版本韋恩圖(upset圖)

    Matlab實現(xiàn)繪制高階版本韋恩圖(upset圖)

    韋恩圖隨著階數(shù)升高會越來越復(fù)雜,當(dāng)階數(shù)達(dá)到7或者以上時幾乎沒辦法繪制,但是使用upset圖卻可以比較輕易的繪制。本文就來用Matlab實現(xiàn)繪制upset圖,需要的可以參考一下
    2023-01-01
  • C++超詳細(xì)講解稀疏矩陣

    C++超詳細(xì)講解稀疏矩陣

    今天小編就為大家分享一篇關(guān)于C++稀疏矩陣的轉(zhuǎn)置思路并實現(xiàn)乘法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2022-05-05
  • 關(guān)于C++中sort()函數(shù)的用法,你搞明白了沒

    關(guān)于C++中sort()函數(shù)的用法,你搞明白了沒

    這篇文章主要介紹了關(guān)于C++中sort()函數(shù)的用法,并通過三種方法介紹了按降序排列的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • C++指針 詳細(xì)介紹及總結(jié)

    C++指針 詳細(xì)介紹及總結(jié)

    這篇文章主要介紹了C++指針 詳細(xì)介紹及總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Qt編寫地圖之實現(xiàn)跨平臺功能

    Qt編寫地圖之實現(xiàn)跨平臺功能

    這篇文章主要介紹了如何利用Qt編寫地圖應(yīng)用時實現(xiàn)跨平臺功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-02-02
  • 基于C語言實現(xiàn)的aes256加密算法示例

    基于C語言實現(xiàn)的aes256加密算法示例

    這篇文章主要介紹了基于C語言實現(xiàn)的aes256加密算法,結(jié)合具體實例形式詳細(xì)分析了C語言實現(xiàn)的aes256加密算法實現(xiàn)步驟與使用技巧,需要的朋友可以參考下
    2017-02-02
  • C++多繼承(多重繼承)的實現(xiàn)

    C++多繼承(多重繼承)的實現(xiàn)

    多繼承容易讓代碼邏輯復(fù)雜、思路混亂,本文主要介紹了C++多繼承(多重繼承)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

淄博市| 商河县| 浠水县| 东至县| 宾阳县| 同心县| 交口县| 五大连池市| 德昌县| 清镇市| 萨嘎县| 康乐县| 定远县| 涿鹿县| 黄陵县| 和政县| 开平市| 新化县| 绩溪县| 门头沟区| 永顺县| 漠河县| 吉水县| 扎鲁特旗| 孙吴县| 永泰县| 伊宁县| 陆河县| 景谷| 黑水县| 阿坝县| 介休市| 黄石市| 民丰县| 北流市| 孙吴县| 霍山县| 邓州市| 吉安县| 获嘉县| 渭南市|