图论之建图方法(邻接表and邻接矩阵)

建图时有点要注意下(现学现卖),为方便图论相关算法使用无向图当成有向图存储更佳(即一条无向边写成两条有向边)
所以无向图空间应=边数*2 最佳。
 1 /*
 2     邻接表建图 
 3 */
 4 #include<iostream>
 5 #include<list>
 6 using namespace std;
 7 const int Maxn=10005;
 8 int n;
 9 //邻接表,
10 /*
11     每条链表示一个节点 
12           and 
13     该链上节点所连接的边 
14 */
15 list<int>edge[Maxn*2];
16 void add_edge(int u,int v){
17     edge[u].push_back(v);
18 }
19 void travel_map(){
20     int i=0;
21     while(i<n){
22         for(list<int>::iterator it=edge[i].begin();it!=edge[i].end();it++){
23              cout<<*it<<" "; 
24         }
25         i++;cout<<endl;
26     }
27 }
28 int main(){
29     cin>>n;
30     while(n--){
31         int u,v;
32         cin>>u>>v;
33         add_edge(u,v);
34     }
35     travel_map();
36     return 0;
37 }
邻接表建图
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int Maxn=10000;
 5 int group[Maxn][Maxn];
 6 int n;
 7 void add_edge(int u,int v,int w){
 8     if(group[u][v]<w){
 9         group[u][v]=w;
10         group[v][u]=w;    
11     }
12 }
13 void Set(){
14     cin>>n;
15     for(int i=0;i<n;i++){
16         group[i][i]=0;
17     }
18     int k=n;
19     int u,v,w;
20     while(k--){
21         cin>>u>>v>>w;
22         add_edge(u,v,w);
23     }
24 }
25 void Print(){
26     for(int i=0;i<n;i++){
27         for(int j=0;j<n;j++){
28             if(group[i][j]!=0){
29                 cout<<group[i][j]<<" ";
30             }
31         }
32     }
33 }
34 int main(){
35     memset(group,0,sizeof(group));
36     Set();
37     Print();
38     return 0;
39 } 
邻接矩阵建图
posted @ 2017-08-14 11:01 逸非安逸 阅读(...) 评论(...) 编辑 收藏