基本概念
二元組(V, E) 稱為圖。V為頂點的集合,E為V中頂點之間的邊的集合。
自環:一條邊的兩個端點是重合的。
重邊:兩個端點之間有兩條以上的邊
簡單圖:沒有自環和重邊的圖
左圖是簡單圖,右圖中存在環和重邊。
邊和向
無向邊:邊是雙向的
有向邊:單向邊,有箭頭
無向圖:只有無向邊的圖
有向圖:只有有向邊的圖
頂點的度
無向圖中,一個頂點相連的邊數稱為該頂點的度。
有向圖中,從一個頂點出發的邊數稱為該頂點的出度;到達該頂點的邊數稱為它的入度。
權和網
在圖的邊給出相關的數,稱為權。
權可以表示一個頂點到另一個頂點的距離,耗費等。帶權圖一般稱為網。
圖的種類
完全圖:任何兩個頂點之間都有邊相連的圖
n階完全圖的任意一點v有:d(v)=n-1
非完全圖:至少有兩個頂點之間無邊相連的圖
稀疏圖:邊很少的圖
稠密圖:邊很多的圖
利用圖解決數學競賽題目(好牛逼啊
例:有一個1982人組成的團體,其中任意4人中至少有一人認識其他三人,求至少有多少人認識這個團體中其他所有人。(額,有點難啊
分析:轉換為圖,人為點,認識為邊。顯然,最多是全部人互相認識,即該圖為完全圖,但該題求最小數,即求非完全圖中d(v)=1981的點的最小個數。
設u,v之間無邊,則d(u)<=1980,d(v)<=1980,再設另外兩點x,y之間也無邊,則不符合題意。所以x,y必定有邊,且其中至少有一個點與u,v有邊,則至少有1979個點與其他點都有邊。
圖的鄰接矩陣表示法
相鄰矩陣是表示結點間相鄰關係的矩陣。
若G=(V,E)是一個具有n個結點的圖,則G的相鄰矩陣是如下定義的二維陣列a,其規模為n*n
A(i,j)= 1 表示頂點i和頂點j有邊
A(i,j)= 0 表示頂點i和頂點j無邊
有就是,兩點為1就有連線,為0無連線
鄰接矩陣為
同樣,網和有向圖表示為:
空間複雜度:O(V^2)
優點:直觀,容易理解,可以直接檢視任意兩點的關係。
缺點:對於稀疏圖,會有很多空間根本沒有利用。不能處理重邊。要查詢某一個頂點的所有邊,要列舉V次。
圖的鄰接連結串列表示法(主要應對稀疏圖)
對圖的每個頂點建立一個單連結串列(n個頂點建立n個單連結串列),第i個單連結串列中的結點包含頂點Vi的所有鄰接頂點。
空間複雜度:有向圖O(V+E)無向圖O(V+2*E)
優點:節省空間,能快速找到某個頂點所有相連的頂點,而無需訪問無關頂點。
對於大多數圖來說都是稀疏圖,所以務必掌握用鄰接連結串列來儲存圖。
鄰接連結串列
struct Edge//儲存每條邊 { int v,w,next }e[maxn]; int k=1,head[maxn];//每條連結串列的第一條邊 void adde(int u,int v,int w)//加邊 { e[k].v=v; e[k].w=w; e[k].next=head[u]; head[u]=k++; }
OK!
拓撲排序