wenbao與鄰接表
阿新 • • 發佈:2018-04-14
pid 結構體 ext AS i++ col tro end can
結構體存儲
1 struct Edge 2 { 3 int to,val,next; 4 }edge[maxn]; 5 int head[maxn]; 6 void addedge(int x,int y,int val) 7 { 8 edge[++cnt].to=y; 9 edge[cnt].val=val; 10 edge[cnt].next=head[x]; 11 head[x]=cnt; 12 }
調用
1 void use(int x){ 2 int u=x;//x為頭結點; 3 for(int i=head[u];i!=-1;i=E[i].next){ 4 v=E[i].to; 5 6 } 7 }
vector存儲
1 #include <cstdio> 2 #include <vector> 3 struct edge{ 4 int v,w; 5 edge(int _v,int _w){ 6 v=_v;w=_w; 7 } 8 }; 9 vector <edge> g[maxn]; 10 voidadd(int x,int y,int z){ 11 g[x].push_back(edge(y,z)); 12 }
調用
1 void use(int x){ 2 int ans=g[x].size(); 3 for(int i=0;i<ans;i++){ 4 int v=g[x][i].v; 5 6 } 7 }
數組模擬
1 const int maxn = 1e5+10; 2 const int maxr = 2e5+10; 3 int index = 1, to[maxn], w[maxn], pre[maxn], p1[maxn]; 4 //插入 5 int x, y, z; 6 for(int i = 0; i < n; ++i){ 7 scanf("%d%d%d", &x, &y, &z); 8 to[index] = y, w[index] = z, pre[index] = p[x], p[x] = index++; 9 } 10 11 //遍歷 12 for(int i = p[v]; i; i = pre[i]){ 13 int vv = to1[i], ww = w[i]; 14 }
----------------------------------------------------------
例題:一般與搜索一起用
南洋理工 --吝嗇的國度 http://acm.nyist.net/JudgeOnline/problem.php?pid=20
vector(動態數組) 好用
上代碼
1 #include <iostream> 2 #include <string.h> 3 #include <vector> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 1e5+10; 7 vector<int> v[maxn]; 8 int a[maxn]; 9 void dfs(int x){ 10 for(int i = 0; i < v[x].size(); i++){ 11 if(!a[v[x][i]]) a[v[x][i]] = x, dfs(v[x][i]); 12 } 13 } 14 int main(){ 15 // freopen("in.txt", "r", stdin); 16 // freopen("out.txt", "w", stdout); 17 int t,n,m,p,q; 18 cin>>t; 19 while(t--){ 20 cin>>n>>m; 21 for(int i = 0; i < n-1; i++){ 22 cin>>p>>q; 23 v[p].push_back(q); 24 v[q].push_back(p); 25 } 26 dfs(m); 27 a[m]=-1; 28 for(int i = 1; i <= n; i++){ 29 if(i != 1) cout<<" "; 30 cout<<a[i]; 31 } 32 cout<<endl; 33 memset(v,0,sizeof(v)); 34 memset(a,0,sizeof(a)); 35 } 36 return 0; 37 }
hdu 2586 :http://acm.split.hdu.edu.cn/showproblem.php?pid=2586
1 #include <iostream> 2 #include <string.h> 3 #include <vector> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 1e5+10; 7 vector<int> v[maxn]; 8 vector<int> vn[maxn]; 9 int a[maxn]; 10 int dfs(int x, int y, int sum){ 11 for(int i = 0; i < v[x].size(); i++){ 12 // cout<<sum<<endl; 13 if(v[x][i] == y) {cout<<sum+vn[x][i]<<endl; return 0;} 14 else if(!a[v[x][i]]) 15 a[v[x][i]] = 1, dfs(v[x][i], y, sum+vn[x][i]); 16 } 17 } 18 int main(){ 19 // freopen("in.txt", "r", stdin); 20 // freopen("out.txt", "w", stdout); 21 int n, flag = 0; 22 cin>>n; 23 while(n--){ 24 if(flag) cout<<endl; 25 memset(v, 0, sizeof(v)); 26 memset(vn, 0, sizeof(vn)); 27 int x, y, p, q, r; 28 cin>>x>>y; 29 for(int i = 0; i < x-1; i++){ 30 cin>>p>>q>>r; 31 v[p].push_back(q); 32 vn[p].push_back(r); 33 v[q].push_back(p); 34 vn[q].push_back(r); 35 } 36 for(int i = 0; i < y; i++){ 37 memset(a, 0, sizeof(a)); 38 cin>>p>>q; 39 a[p] = 1; 40 dfs(p, q, 0); 41 } 42 flag = 1; 43 } 44 return 0; 45 }
只有不斷學習才能進步!
wenbao與鄰接表