#includeusing namespace std;
//使用鄰接表來儲存圖,把m遠小於n^2的圖稱為稀疏圖 ,適合稀疏圖,可以把時間複雜度優化到o(m+n)logn
#define maxn 9999
int n,m;
int u[maxn],v[maxn],w[maxn];
//first要比n大1,next要比n大1
//初始化first陣列下標1~n的值為-1,表示1~n頂點暫時沒有邊。
//first存的是1~n號頂點的第一條邊的編號,next[u[i]]儲存"編號為i的邊"的下一條編號。
int first[maxn],next[maxn];
void create() //建立鄰接表
for(int i=1;i<=m;i++)
}void print()//遍歷每一條邊 }}
int main() }
/* 4 5
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7
*/
一、vector 簡介及基本操作:
1、vector是c++中stl庫中封裝好的容器,常用定義不定長陣列來構建無向圖或有向圖.
2、基本操作:
(1)標頭檔案#include.
(2)建立vector物件,vectorvec;
(3)尾部插入數字:vec.push_back(a);
(4)使用下標訪問元素,cout<(5)使用迭代器訪問元素.
vector::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;
(7)刪除元素: vec.erase(vec.begin()+2);刪除第3個元素
vec.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j-1];區間從0開始
(8)向量大小:vec.size();
(9)清空:vec.clear();
vector的元素不僅僅可以使int,double,string,還可以是結構體,但是要注意:結構體要定義為全域性的,否則會出錯。
如下例:
struct node ;
vector g[ ];
二、構建圖:
(1)定義不定長陣列 vector map[100010] ;
(2) 建邊
for(i=1; i < = n ; i + +)
scanf("%d%d",&s,&t,);
map[s].push_back(t);
map[t].push_back(s); //有向圖時,此步省略。
(3)遍歷
for (i=0; i< = map[s].size(); i++)
printf("%d\n",map[s][i]);
#include#define n 10000
using namespace std;
struct edge
;vectorg[n];//g[i]中i表示出發點
int m,n;
int temp1;//出發點
int main()
for (int i=1;i<=n;i++)//按照出發點的順序遍歷
}return 0;
}
陣列模擬鄰接表儲存
鄰接矩陣看上去是個不錯的選擇,首先是容易理解,第二是索引和編排都很舒服但是我們也發現,對於邊數相對頂點較少的圖,這種結構無疑是存在對儲存空間的極大浪費。因此我們可以考慮另外一種儲存結構方式,例如把陣列與鍊錶結合一起來儲存,這種方式在圖結構也適用,我們稱為鄰接表 adjacencylist 每乙個單鏈...
鄰接表的幾種儲存方式
總的來說有以下三種方式 鍊錶 儲存結構 struct node node head m 新增乙個有向邊 void addadj int u,int v 遍歷 for node p head u p null p p next int v p vex 連線u的結點v 初始化 memset head,n...
資料儲存方案 鄰接列表模式
在程式開發中,我們常遇到用樹型結構來表示某些資料間的關係,如企業的組織架構 商品的分類 操作欄目等,目前的關係型資料庫都是以二維表的形式記錄儲存資料,而樹型結構的資料如需存入二維表就必須進行schema設計。adjacency list 鄰接列表模式 簡單的說是根據節點之間的繼承關係,顯現的描述某一...