圖生成演算法
Ⅰ 圖的所有生成樹的演算法
邊構成,並包含G的所有頂點的樹稱為G的生成樹(G連通).
加權無向圖G的生成樹的代價是該生成樹的所有邊的代碼(權)的和.
最小代價生成樹是其所有生成樹中代價最小的生成樹.
參考代碼:
(僅為主程序,更多代碼在
解壓密碼: )
#include "Sets.h"
#include "themap.h"
#include "windows.h"
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
/*
功能:
演示Kruskal演算法和Prim演算法
集合的並,元素查找的操作及應用
說明:
代碼均在vc++6.0環境下編譯均通過
在非VC++6.0環境下編譯請去掉頭文件 windows.h 和函數 end()
如果NULL未定義請自定義
#define NULL 0 或
#define NULL ((void*)0)
作者:
hacker
時間:
2007.2.3
*/
const VSIZE = 7;//7個頂點
const INFINITY = 10000;//10000作為無窮大來處理
void LoadData(int cost[][VSIZE+1], Edge edge[]);
void end();
/*
函數名:
Kruskal 和 Prim
參數:
邊,代價,邊數,頂點數,最小代價生成樹的頂點
返回值:
返回值為-1,不存在最小代價生成樹
返回值大於0時為最小代價生成樹的代價
最小代價生成樹的邊在vector<Edge>& t
*/
int Kruskal(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t);
int Prim (Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t);
int main()
{
int cost[VSIZE+1][VSIZE+1];//0不用
Edge edge[9];//9條邊
vector<Edge> t;//用來存儲最小代價生成樹的頂點
int mincost;//最小代價
LoadData(cost, edge);
if ( (mincost = Kruskal(edge, cost, 9, VSIZE, t))!=-1)
{
cout<<"最小代價是:"<<mincost<<endl<<"邊是:";
for (int i = 0;i<t.size();i++)
cout<<t[i];
cout<<endl;
}
t.clear();
if ( (mincost = Prim(edge, cost, 9, VSIZE, t))!=-1)
{
cout<<"最小代價是:"<<mincost<<endl<<"邊是:";
for (int i = 0;i<t.size();i++)
cout<<t[i];
cout<<endl;
}
end();
return 1;
}
void LoadData(int cost[][VSIZE+1], Edge edge[])
{
edge[0].u = 1; edge[0].v = 2; edge[0].weight = 28;
edge[1].u = 1; edge[1].v = 6; edge[1].weight = 10;
edge[2].u = 2; edge[2].v = 3; edge[2].weight = 16;
edge[3].u = 2; edge[3].v = 7; edge[3].weight = 14;
edge[4].u = 3; edge[4].v = 4; edge[4].weight = 12;
edge[5].u = 4; edge[5].v = 5; edge[5].weight = 22;
edge[6].u = 4; edge[6].v = 7; edge[6].weight = 18;
edge[7].u = 5; edge[7].v = 6; edge[7].weight = 25;
edge[8].u = 5; edge[8].v = 7; edge[8].weight = 24;
for (int i=1;i<=7;i++)
for (int j=1;j<=i;j++)
cost[i][j] = cost[j][i] = INFINITY;
for (i=0;i<9;i++)
cost[edge[i].u][edge[i].v] =
cost[edge[i].v][edge[i].u] = edge[i].weight;
}
int Kruskal(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t)
{
Sets s(esize);
priority_queue<Edge, vector<Edge>, EdgeGreater> pq;
int mincost = 0;
for (int i = 0;i<esize;i++)
//把所有的邊放入優先隊列
pq.push(edge[i]);
i = 0;
while (i<vsize-1 && !pq.empty())
{
Edge temp = pq.top();//取出當前權最小的邊
pq.pop();
int j = s.SimpleFind(temp.u);
int k = s.SimpleFind(temp.v);
if (j!=k)//如果不構成環
{
i++;
t.push_back(temp);
mincost +=cost[temp.u][temp.v];
s.SimpleUnion(j, k);
}
}
if (i!=vsize-1)
{
t.clear();
return -1;
}
else
{
return mincost;
}
}
int Prim(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t)
{
priority_queue<Edge, vector<Edge>, EdgeGreater> pq;
vector<Edge> sortededge;
int i;
for (i =0;i<esize;i++)
pq.push(edge[i]);
for (i =0;i<esize;i++)
{//對邊進行從小到大排列,放到sortededge中
sortededge.push_back(pq.top());
pq.pop();
}
int distance[VSIZE+1];
int j;
int mincost = sortededge[0].weight;
Edge temp = sortededge[0];
t.push_back(temp);
for (i=1;i<=vsize;i++)
distance[i] = 1;//每個點都不在已生成樹里
distance[temp.u] = distance[temp.v] = 0;//最短的邊的兩個點放到生成樹里
for (i=2;i<=vsize-1;i++)
{//尋找另外的邊
int exist = 0;//設置是否找到符合條件的邊的狀態標志為未找到
for (j=1;j<esize;j++)
if (distance[sortededge[j].u] ^ distance[sortededge[j].v] == 1)
{//由於邊是排序好了的,所以從小邊向大邊找,找到的第一個符合條件的邊可以
//加到生成樹里
int k = (distance[sortededge[j].u] == 0) ? sortededge[j].v :\
sortededge[j].u;
distance[k] = 0;
mincost += sortededge[j].weight;
t.push_back(sortededge[j]);
exist = 1;
break;
}
if (!exist)
{
t.clear();
return -1;
}
}
return mincost;
}
void end()
{
if (MessageBox(NULL,\
"歡迎到學習交流(源代碼在論壇下載)\n\t\t(確定後自動訪問論壇)",\
"supcoder", IDOK) == IDOK)
{
char cmdLine[] = "iexplore ";
char path[256];
char buf[256];
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
PROCESS_INFORMATION ProcessInformation;
GetSystemDirectory(buf, 256);
sprintf(path, "%c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE", buf[0]);
CreateProcess(path,cmdLine, NULL, NULL, 1, 0, NULL, NULL, &si, &ProcessInformation);
}
cout<<"==============================================================================="<<endl;
cout<<"\t\t\t\t 謝謝使用!"<<endl;
cout<<"\t\t\t "<<endl;
Sleep(1000);
}
Ⅱ 求圖的生成樹的演算法有哪些
在圖論中,對於這種權值固定且為正的連通圖來說,有比較成熟的最小生成樹演算法。如著名的Prim演算法和Kruskal演算法,這兩個演算法都是貪心演算法的例子Prim演算法的時間復雜度為 ,適合求邊稠密的網路圖的最小生成樹;Kruskal演算法的時間復雜度為 ,適合求邊稀疏的網路圖的最小生成樹。
Ⅲ 圖的最小生成樹演算法
圖的生成樹和最小生成樹生成樹(SpanningTree):如果一個圖的子圖是一個包含圖所有節點的樹,那這個子圖就稱為生成樹.
Ⅳ 最小生成樹的兩種演算法 圖的最小生成樹的兩個主要演算法是什麼它們各自的特點
主要有兩個:
1.普里姆(Prim)演算法
特點:時間復雜度為O(n2).適合於求邊稠密的最小生成樹.
2.克魯斯卡爾(Kruskal)演算法
特點:時間復雜度為O(eloge)(e為網中邊數),適合於求稀疏的網的最小生成樹.
Ⅳ 怎麼通過演算法大量生成圖片
首先需要製作一個nodejs小程序,然後通過該程序開始運行演算法,通過小程序的建模生成圖片,這樣就可以通過演算法生成大量的圖片。首先,先介紹廣告創意圖片的整體生成流程:用戶先提供必要的信息,如廣告標題、促銷信息、廣告商品圖等,然後通過介面發送做圖程序。
做圖程序是一個nodejs服務,nodejs會啟動一個後端的headless模式的chrome,我們使用的是puppeteer,然後puppeteer啟動真正的做圖程序。
做圖主程序使用js和canvas進行編寫,js根據傳入的參數,計算出最合適的模板,然後進行配色、配置背景圖、裝飾文本、裝飾商品圖等各種繁瑣細節的操作,最終在HTML里通過canvas渲染出所有的創意圖片。
最後再通過nodejs,做圖完成,nodejs再調用puppeteer計算位置關系等進行截圖,生成最終的圖片。
Ⅵ petri網可達圖生成演算法的編程。。。
M=256;%原圖像長度 N=32;%水印圖像長度 K=8; %圖像分塊大小 I=zeros(M,M);%創建一個零矩陣,用於存放載體圖像 J=zeros(N,N); %創建一個零矩陣,用於存放水印圖像 BLOCK=zeros(K,K);%創建一個零矩陣,用於存放圖像分塊 %顯示水印圖像 subplot(1,8,2); J=imread('14','bmp'); %讀入水印圖像 imshow(J); %顯示水印圖像 title('水印圖像'); %顯示原圖像 subplot(1,3,2); I=imread('11','bmp'); %讀入原始圖像 imshow(I); %顯示原始圖像 title('原始公開圖像'); %嵌入水印 tem=1;%創建變數tem,沒用 for p=1:N%水印圖像行循環 for q=1:N%水印圖像列循環 x=(p-1)*K+1; %x為載體圖像行坐標 y=(q-1)*K+1; %y為載體圖像列坐標 BLOCK=I(x:x+K-1,y:y+K-1); %BLOCK為載體圖像I的分塊,分塊大小為K*K,...
Ⅶ 以圓的Bresenham生成演算法為例,圖解矢量圖形和光柵圖形的區別
有電子藝術圖像被分為兩種核心類型:光柵圖像(也稱為「點陣圖」)和矢量圖像。簡而言之,光柵圖像由連接的點組成,矢量是由連接的線組成的圖像。這兩種格式彼此完全不同,但當適當地用於所需的最終輸出方法時,它們彼此形成對比和互補。光柵圖像通過掃描源圖稿或使用照片編輯或繪圖程序(如Corel、PhotoPAINT或Adobe PhotoShop)「繪畫」來創建,而矢量圖像是通過使用CorelDRAW或Adobe Illustrator等矢量插圖程序繪制的過程來創建的。
一、Bresenham演算法原理
由Bresenham提出的一種精確而有效的光柵線生成演算法,可用於顯示線、圓和其他曲線的整數增量運算。它是目前最有效的線段生成演算法。
推導:
設線段端點:(,),(,),∆x和∆y為水平和垂直偏移量,m為斜率
當|m| <= 1時,對於給定的x增量∆x
當|m| >= 1時,對於給定的y增量∆y,
(當 0<m < 1)
假設已經確定了要顯示的像素,那麼,需要確定下一點是繪制在,
還是。
根據直線的方程,直線上處的y坐標為:
將m帶入d1 – d2中,並變換得:
其中,為演算法中第k步的決策參數,c為一常量,其值為。
那麼:
若,即,有
若, 即,有
同理,可求得第k+1步的決策參數
因此,有如下遞推關系:
因為0<m<1 因此,帶入上式得:
其中,的值取決於的值:
當時,,
當時, ,
Bresenham演算法描述 (0 < m < 1)
演算法從線段的起始端點開始,反復計算每個點的決策參數並繪制像素。
起始端點處的決策參數為:
演算法:
1、輸入線段的兩個端點,並將左端點存儲在中;
2、將裝入幀緩沖器,畫出第一個點;
3、計算常量∆x,∆y,2∆y 和2∆y – 2∆x,並得到決策參數的第一個值:
4、從k = 0開始,在沿線的每個處,進行下列檢測:
若,下一個待畫點是,且
若 ,下一個待畫點是,且
5、重復步驟4,共∆x次。
————————————————
版權聲明:本文為CSDN博主「地澤萬物」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41883085/article/details/102706471
Ⅷ (專家進來)雙代號網路圖自動生成演算法
還沒有研究出來,如果你願意等,十年八年應該沒問題能搞定,嘻嘻
、、、
老大加油,,,
Ⅸ voronoi圖的生成方法
四叉樹歸並構成VORONOI圖的演算法
}
int gridnum;
int seq;
int totalnum;
int gridnum;
}
class voronoi{
struct graph{
CDC Polygon();
}
struct onlineincremeth{
}
}
class grid{
void
int num.range;
int serial;
int totalnum;
int pointnum;
int pointtotalnum;
int layer;
int morton.availabledigit;
int morton.lastdigit;
Ⅹ 求圖論的生成子圖演算法,要求生成盡可能多的子圖
在圖論的歷史中,還有一個最著名的問題--四色猜想。這個猜想說,在一個平面或球面上的任何地圖能夠只用四種顏色來著色,使得沒有兩個相鄰的國家有相同的顏色。每個國家必須由一個單連通域構成,而兩個國家相鄰是指它們有一段公共的邊界,而不僅僅只有一個公共點。20世紀80-90年代曾邦哲的綜合系統論(結構論)觀將「四色猜想」命題轉換等價為「互鄰面最大的多面體是四面體」。四色猜想有一段有趣的歷史。每個地圖可以導出一個圖,其中國家都是點,當相應的兩個國家相鄰時這兩個點用一條線來連接。所以四色猜想是圖論中的一個問題。它對圖的著色理論、平面圖理論、代數拓撲圖論等分支的發展起到推動作用。 (下圖是在上下對折再左右對折以後形成一個輪胎形狀,有7個區域兩兩相連,就是說在一個環面上作圖,需要7種顏色,外國數學家構造林格證明:Np=[(7+√1+48p)/2],p=1,N1=7。
圖論中最著名的四色猜想解決辦法 韓世君利用三角形性質和數學歸納法解決了四色猜想 摘要:將平面圖的不相連點使其相連(這樣增加著色難度),形成有許多三角形相連的平面圖,根據三角形的穩定性,利用數學歸納法,平面圖進行著色最多需4種顏色。 定理:在平面圖中,對不同頂點進行著色,相鄰頂點著不同顏色,不相鄰頂點著相同顏色,則最多需4種顏色。 證明:在平面圖中,不在同一直線上的三點決定一個平面,那麼三點構成的三角形是平面圖中最基本、最簡單、最穩定、密閉的圖形。 由於在對地圖著色過程中不考慮圖的具體形狀只考慮點是否相鄰,將平面圖的不相連點使其相連(這樣增加著色難度),形成有許多三角形相連的平面圖(三點以下肯定成立)。如圖1:添加輔助線(不相鄰的點使其相鄰,這樣就增加了著色的色數,有利於證明),將圖1分解為4個△ABC。 在平面圖中的無數點中,任取相鄰三點構成各點相鄰的△ABC(見圖2),則需3種顏色A B C,在平面圖中再任取一點 D 與 A B C 三點相鄰,同時D又與A B C三點相連後形成三角形。任取一點E與 A、B、C、D四色相連,E必與四色之一色相同即E點在△ABD中與C色相同、在△ACD中與B色相同、在△BCD中與A色相同、在△ABC外與D色相同,E與另外三色相連形成新的三角形。 在三角形的三點之外任取一點只有在三角形的內部和外部兩種情況且這兩種情況的點不會相鄰,該點最多與三角形的三點相連且又形成新的三角形。 繼續選取一點進行著色,該點同樣最多與三角形的三點相連且又形成新的三角形,該點至少為四色中的一色。逐點(第n點)著色至將所有點(第n+1點)著色只須A、B、C、D四色其中一色。 圖的著色方法:任意一張地圖,將孤立的點用一種顏色著色(A色),不能形成密閉圖形的相連的點用兩種顏色(A、B色)。將剩餘的點不相連的用虛線使其相連形成許多三角形,完全不相連的圖不進行相連。任取相連三點著三種顏色(A、B、C色),再取與其相連的點,如果與A、B、C三色的點都相連著D色,否則著與其不相連的其中一色,用虛線相連的點可以用同一種顏色也可以用兩種顏色,依次取與著色的點相連的點用以上方法進行著色。這樣對所有的點進行著色最多用四色(A、B、C、D色)。 圖論的廣泛應用,促進了它自身的發展。20世紀40-60年代,擬陣理論、超圖理論 、極圖理論,以及代數圖論、拓撲圖論等都有很大的發展 拓撲學在泛函分析、李群論、微分幾何、微分方程和其他許多數學分支中都有廣泛的應用。 (右圖是:下面的三叉安在上面的環面上,就是有3個洞的9個兩兩相連區域,上面的圖上下對折再左右對折就是一個輪胎形狀環面圖2)
左圖是虧格為4時10個兩兩相連區域構造,上圖上下對折,再左右對折,形成一個輪胎形狀,再把下面的四叉按照A,B,C,D編號安上,就是有4個洞的兩兩相連區域圖3(王曉明構造)。