国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu):地圖著色問題——圖的應用——回溯法

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu):地圖著色問題——圖的應用——回溯法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

前言

一、解決問題的思路

二、存儲結(jié)構(gòu)設計

三、代碼

1.創(chuàng)建圖函數(shù)

2.判斷色號是否相同函數(shù)

3.回溯函數(shù)

4.整體代碼

總結(jié)


前言

本次解決的問題:用圖模擬部分地圖,對各省進行著色,要求相鄰省所使用的顏色不同,并保證使用的顏色總數(shù)最少。

先來一張效果圖

圖著色問題回溯算法,c++,數(shù)據(jù)結(jié)構(gòu),算法,深度優(yōu)先


一、解決問題的思路

將鄰接矩陣創(chuàng)建好了以后,通過回溯函數(shù),在解空間樹中搜索所有的可行解,如果著色有沖突,就回溯到上一個節(jié)點。一旦到達葉子節(jié)點,也就是這個解到頭了,就輸出這種著色方案。

二、存儲結(jié)構(gòu)設計

a

抽象數(shù)據(jù)類型:

????????ADT Graph{

????????數(shù)據(jù)對象V:一個非空集合,該集合中的所有元素具有相同的特性。

????????數(shù)據(jù)關系RR={VR},VR={<x,y> | P(x,y) (x,y∈V)}

基本操作:

????????Createmap(&G)

????????操作前提:已知圖G不存在。

????????操作結(jié)果:創(chuàng)建圖G

????????}ADT Graph;

(b) 存儲結(jié)構(gòu):順序表存儲結(jié)構(gòu)

????????typedef struct{

?? ????????char vertax[MAX][MAX];//頂點所屬的省份

?? ????????int map[MAX][MAX]; //鄰接矩陣

?????????? int n; //頂點個數(shù)

?????????? int m;//邊的個數(shù)

????????}Graph;

三、代碼

1.創(chuàng)建圖函數(shù)

這里沒什么好說的,都是創(chuàng)建圖所需要的輸入。頂點個數(shù),頂點所代表的省份也就是頂點名稱,邊的個數(shù),有邊相連的兩個頂點。

void Createmap(Graph &G) //創(chuàng)建鄰接矩陣
{
	printf("請輸入頂點(省份)個數(shù):");
    int f=scanf("%d", &G.n);
    while(f!=1)
	{
		printf("輸入值非法!\n");
		printf("請重新輸入頂點(省份)個數(shù):");
		fflush(stdin);
		f=scanf("%d", &G.n);
	}
    for(int i=1;i<=G.n;i++)
    {
    	printf("請輸入第%d個頂點所代表的省份:",i);
    	cin>>G.vertax[i];
	}
    int u; //頂點1
    int v; //頂點2
    cout << "\n請輸入邊的個數(shù):";
    cin >> G.m;
    cout << "請輸入有邊相連的兩個頂點u和v:"<< endl;
    for (int i=1;i<=G.m;i++)//為鄰接矩陣賦值 
    {
        cin>>u>>v;
        G.map[u][v]=1;
        G.map[v][u]=1;
    }
    cout<<endl;
}

2.判斷色號是否相同函數(shù)

先判斷是否相連,如果相連則判斷兩個頂點顏色是否一樣。如果頂點顏色不沖突,就返回真,反之返回假。

bool Find(Graph G,int t) //判斷色號是否相同的函數(shù)
{
    for(int j=1;j<t;j++) //判斷現(xiàn)在擴展點t和前面t-1個頂點有沒有相連的
    {
        if(G.map[t][j]) //如果相連
        {
            if(color[j]==color[t]) //且顏色一樣
            {
                return false; //返回false,表示需要換個色號嘗試
            }
        }
    }
    return true;
}

3.回溯函數(shù)

判斷是否到達了葉子節(jié)點,如果沒有,則開始試探這個頂點著此顏色行不行,行就向下遞歸,進入下一個節(jié)點開始著色試探,不行就換一種顏色繼續(xù)試探,直到所有顏色被試探完。

void Backtrack(Graph G,int t) //回溯函數(shù)
{
    if(t>G.n) //到達葉子節(jié)點,打印一種填色方案 
    {
    	answer=0;//找到最少的顏色個數(shù) 
        sum++; //方案個數(shù)+1
        cout << "第"<< sum << "種方案:";
        for (int i=1;i<=G.n;i++)
        {
            cout << color[i] << " ";
        }
        cout << endl;
    }
    else
    {
        for (int i=1;i<=color_nums;i++) //嘗試別的色號
        {
            color[t]=i;  //試探色號i 
            if(Find(G,t)) //如果色號沒有撞
            {
                Backtrack(G,t+1); //向下遞歸 
            }
        }
    }
}

4.整體代碼

#include <iostream>
using namespace std;
 
const int MAX=111;//最大存儲個數(shù) 
typedef struct{
	char vertax[MAX][MAX];//頂點所屬的省份 
	int map[MAX][MAX]; //鄰接矩陣
	int n; //頂點個數(shù)
	int m;//邊的個數(shù)
}Graph; 

int color[MAX]; //解空間,表示第i個省所填的顏色 
int sum=0; //記錄有多少種方案

int color_nums=0; //顏色數(shù)量
int answer=1;

void Createmap(Graph &G) //創(chuàng)建鄰接矩陣
{
	printf("請輸入頂點(省份)個數(shù):");
    int f=scanf("%d", &G.n);
    while(f!=1)
	{
		printf("輸入值非法!\n");
		printf("請重新輸入頂點(省份)個數(shù):");
		fflush(stdin);
		f=scanf("%d", &G.n);
	}
    for(int i=1;i<=G.n;i++)
    {
    	printf("請輸入第%d個頂點所代表的省份:",i);
    	cin>>G.vertax[i];
	}
    int u; //頂點1
    int v; //頂點2
    cout << "\n請輸入邊的個數(shù):";
    cin >> G.m;
    cout << "請輸入有邊相連的兩個頂點u和v:"<< endl;
    for (int i=1;i<=G.m;i++)//為鄰接矩陣賦值 
    {
        cin>>u>>v;
        G.map[u][v]=1;
        G.map[v][u]=1;
    }
    cout<<endl;
}
 
bool Find(Graph G,int t) //判斷色號是否相同的函數(shù)
{
    for(int j=1;j<t;j++) //判斷現(xiàn)在擴展點t和前面t-1個頂點有沒有相連的
    {
        if(G.map[t][j]) //如果相連
        {
            if(color[j]==color[t]) //且顏色一樣
            {
                return false; //返回false,表示需要換個色號嘗試
            }
        }
    }
    return true;
}
 
void Backtrack(Graph G,int t) //回溯函數(shù)
{
    if(t>G.n) //到達葉子節(jié)點,打印一種填色方案 
    {
    	answer=0;//找到最少的顏色個數(shù) 
        sum++; //方案個數(shù)+1
        cout << "第"<< sum << "種方案:";
        for (int i=1;i<=G.n;i++)
        {
            cout << color[i] << " ";
        }
        cout << endl;
    }
    else
    {
        for (int i=1;i<=color_nums;i++) //嘗試別的色號
        {
            color[t]=i;  //試探色號i 
            if(Find(G,t)) //如果色號沒有撞
            {
                Backtrack(G,t+1); //向下遞歸 
            }
        }
    }
}
 
void Print() 
{
	printf("\n最少需要%d種顏色",color_nums);
}

int main()
{
	cout << "用圖模擬部分地圖,對各省進行著色,要求相鄰省所使用的顏色不同,并保證使用的顏色總數(shù)最少\n"<< endl;
	Graph G;

    Createmap(G);
    while(answer)
    {
    	color_nums++;//顏色總數(shù)+1 
    	Backtrack(G,1);	
	}
	 
    Print();
    return 0;
}

總結(jié)

回溯算法采取的是這條路走不通就返回換下一條路走的思想,我覺得是蠻力法的優(yōu)化算法,它避免了蠻力法窮舉式的搜索。這是一種具有深度優(yōu)先的策略,也就是如果某一個節(jié)點滿足約束條件,則繼續(xù)向下一個節(jié)點試探,直到找到解為止。雖然回溯法有限界和剪枝函數(shù)減小了搜索范圍,但本身是類似于窮舉思想,所以時間復雜度仍然很高,但也因此解決問題的范圍很廣。文章來源地址http://www.zghlxwxcb.cn/news/detail-766812.html

到了這里,關于數(shù)據(jù)結(jié)構(gòu):地圖著色問題——圖的應用——回溯法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據(jù)結(jié)構(gòu)專題實驗7——圖的應用(景點管理)(C++實現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)專題實驗7——圖的應用(景點管理)(C++實現(xiàn))

    實驗內(nèi)容:應用圖的技術,根據(jù)需求文件要求的功能,實現(xiàn)旅游景點的管理。實驗要求: 使用圖的數(shù)據(jù)結(jié)構(gòu)建立一個景點圖的結(jié)構(gòu)。 可以查找各景點信息。 旅游景點導航,使用深度優(yōu)先,從一個景點開始遍歷所有景點。 查找一個景點到另一個景點的最短路徑。 對景點道路

    2024年02月04日
    瀏覽(23)
  • Java高階數(shù)據(jù)結(jié)構(gòu) & 圖的最短路徑問題

    Java高階數(shù)據(jù)結(jié)構(gòu) & 圖的最短路徑問題

    圖的最短路徑問題! 圖的基礎知識博客:傳送門 最短路徑問題: 從在帶權圖的某一頂點出發(fā),找出一條通往另一頂點的最短路徑, 最短也就是沿路徑各邊的權值總 和達到最小 。 一共會講解三種算法 Dijkstra算法【單源最短路徑】 Bellman-Ford算法【單源最短路徑】 改進:SPF

    2024年02月04日
    瀏覽(28)
  • 【Java高階數(shù)據(jù)結(jié)構(gòu)】圖的最短路徑問題

    【Java高階數(shù)據(jù)結(jié)構(gòu)】圖的最短路徑問題

    圖的最短路徑問題! 圖的基礎知識博客:傳送門 最短路徑問題: 從在帶權圖的某一頂點出發(fā),找出一條通往另一頂點的最短路徑, 最短也就是沿路徑各邊的權值總 和達到最小 。 一共會講解三種算法 Dijkstra算法【單源最短路徑】 Bellman-Ford算法【單源最短路徑】 改進:SPF

    2024年02月08日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)-圖的遍歷和應用(DAG、AOV、AOE網(wǎng))

    數(shù)據(jù)結(jié)構(gòu)-圖的遍歷和應用(DAG、AOV、AOE網(wǎng))

    目錄 *一、廣度優(yōu)先遍歷(BFS) 廣度優(yōu)先生成樹 廣度優(yōu)先生成森林 *二、深度優(yōu)先遍歷 深度優(yōu)先生成樹 深度優(yōu)先生成森林 二、應用 2.1最小生成樹 *Prim算法 *Kruskal算法 2.2最短路徑 ?*BFS算法 *Dijkstra算法 ?*Floyd算法 *2.3有向無環(huán)圖(DAG網(wǎng)) ?*2.4拓撲排序(AOV網(wǎng)) *逆拓撲排序 ?*2.5關鍵路

    2024年02月10日
    瀏覽(24)
  • C語言數(shù)據(jù)結(jié)構(gòu)——圖的最短路徑算法解決實例問題

    C語言數(shù)據(jù)結(jié)構(gòu)——圖的最短路徑算法解決實例問題

    一、問題描述 W公司在某個地區(qū)有6個產(chǎn)品銷售點,現(xiàn)根據(jù)業(yè)務需要打算在其中某個銷售點上建立一個中心倉庫,負責向其他銷售點提供產(chǎn)品。由于運輸線路不同,運輸費用也不同。假定每天需要向每個銷售點運輸一次產(chǎn)品,那么應將中心倉庫建在哪個銷售點上,才能使運輸費

    2024年02月08日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)(12)Dijkstra算法JAVA版:圖的最短路徑問題

    數(shù)據(jù)結(jié)構(gòu)(12)Dijkstra算法JAVA版:圖的最短路徑問題

    目錄 12.1.概述 12.1.1.無權圖的最短路徑 ?12.1.2.帶權圖的最短路徑 1.單源最短路徑 2.多源最短路徑 12.2.代碼實現(xiàn) 無權圖的最短路徑,即最少步數(shù),使用BFS+貪心算法來求解最短路徑,比較好實現(xiàn),此處不做展開討論。 有權圖的最短路徑,不考慮權重為負數(shù)的情況,因為權重為負

    2024年02月06日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】圖的應用:最小生成樹;最短路徑;有向無環(huán)圖描述表達式;拓撲排序;逆拓撲排序;關鍵路徑

    【數(shù)據(jù)結(jié)構(gòu)】圖的應用:最小生成樹;最短路徑;有向無環(huán)圖描述表達式;拓撲排序;逆拓撲排序;關鍵路徑

    目錄 1、最小生成樹 1.1 概念? 1.2 普利姆算法(Prim) 1.3 克魯斯卡爾算法(Kruskal)? 2、最短路徑 2.1 迪杰斯特拉算法(Dijkstra) 2.2 弗洛伊德算法(Floyd)? 2.3 BFS算法,Dijkstra算法,F(xiàn)loyd算法的對比 3、有向無環(huán)圖描述表達式 3.1 有向無環(huán)圖定義及特點 3.2 描述表達式 4、拓撲排序

    2024年02月07日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)第11周 :(圖的遍歷及連通性 + 犯罪團伙 + 圖形窗口問題 + 最小生成樹的權值之和 + Jungle Roads )

    【問題描述】 根據(jù)輸入的圖的鄰接矩陣A,判斷此圖的連通分量的個數(shù)。請使用鄰接矩陣的存儲結(jié)構(gòu)創(chuàng)建圖的存儲,并采用BFS優(yōu)先遍歷算法實現(xiàn),否則不得分。 【輸入形式】 第一行為圖的結(jié)點個數(shù)n,之后的n行為鄰接矩陣的內(nèi)容,每行n個數(shù)表示。其中A[i][j]=1表示兩個結(jié)點鄰接

    2024年02月06日
    瀏覽(35)
  • 圖的著色問題

    問題1: 圖著色問題是一個著名的NP完全問題。給定無向圖G=(V,E),問可否用K種顏色為V中的每一個頂點分配一種顏色,使得不會有兩個相鄰頂點具有同一種顏色? 但本題并不是要你解決這個著色問題,而是對給定的一種顏色分配,請你判斷這是否是圖著色問題的一個解。 輸入

    2023年04月20日
    瀏覽(15)
  • 【python-回溯法-圖的m著色問題】

    【python-回溯法-圖的m著色問題】

    ? ? ?

    2024年02月11日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包