学长的临接表代码
单向临接表
1 #include<bits/stdc++.h> 2 3 const int maxn = 10000 + 5; 4 5 int EdgeHeadR[maxn];//某点的表头 6 int cntEdge; 7 8 struct Edge { 9 int nowNode, R; 10 } edge[maxn];//nowNode是边maxn指向的点 R存的是边maxn的下一条边 11 12 void addedge(int u, int v) 13 { 14 ++ cntEdge; 15 int HeadR = edge[EdgeHeadR[u]].R;//用HeadR代替u表头的下一条边 16 edge[cntEdge].nowNode = v; //当前边所指向的数变为v 17 edge[cntEdge].R = HeadR;//当前边的下一条边变为HeadR 也就是原u表头的下一条边 18 EdgeHeadR[u] = cntEdge;//u表头的下一条边更新为 当前边 19 } 20 21 void addedge2(int u, int v) 22 { 23 addedge(u, v); 24 addedge(v, u); 25 } 26 27 int n, m; 28 29 int vis[maxn]; 30 31 void DFS(int u) 32 { 33 vis[u] = true;//标记已查过 34 for (int i = EdgeHeadR[u]; i != 0; i = edge[i].R) { 35 //直到查到最后一个点 否则继续查 36 int v = edge[i].nowNode;//第i个所代表的点 37 if (vis[v] == false) DFS(v); 38 } 39 } 40
临接表 + vector + 临接矩阵
1 int main() 2 { 3 std::cin >> n >> m; 4 for (int i = 1; i <= m; ++ i) { 5 int u, v; 6 std::cin >> u >> v; 7 addedge2(u, v); 8 } 9 10 for (int i = 1; i <= n; ++ i) 11 if (!vis[i]) 12 DFS(i); 13 return 0; 14 } 15 16 #include<bits/stdc++.h> 17 using namespace std; 18 #define NUM 801989 19 long long h[NUM]; 20 long long aa,bb; 21 int k1,k2,head,tail; 22 int oo; 23 int x[5] = {0, 1, 0, -1, 0}; 24 int y[5] = {0, 0, 1, 0, -1}; 25 int dui[10000][5]; 26 struct MM{ 27 int a[100][100]; 28 }kkk[100]; 29 bool sou( long long m ){ 30 long long u = m % NUM; 31 while( h[u] !=m && h[u] !=0 ) u++; 32 if( h[u] == 0 ) { 33 h[u] = m;//cout<<" "<<m<<endl; 34 return true; 35 } 36 return false; 37 } 38 long long jisuan(int k){ 39 long long u=0; 40 for (int i=0 ; i<=2 ; i++) 41 for(int j=0 ; j<=2 ; j++){ 42 u = u*10 + kkk[k].a[i][j]; 43 } //cout<<u<<" "<<endl; 44 return u; 45 } 46 void search (int u){//number:u cixu:m step:n; 47 48 while(tail!=head){ 49 head++; 50 long long g; 51 for(int i=1 ; i<=4 ; i++){ 52 int xx = dui[head][1]+x[i], yy = dui[head][2]+y[i] ; 53 if( xx>=0 && xx<=2 && yy>=0 && yy<=2 ){ 54 u++; 55 for(int mm=0;mm<=2;mm++) 56 for(int hh=0;hh<=2;hh++) 57 kkk[u].a[mm][hh]=kkk[dui[head][4]].a[mm][hh]; 58 swap( kkk[u].a[dui[head][1]][dui[head][2]] , kkk[u].a[xx][yy] ); 59 g= jisuan(u); 60 if( g==bb ) { 61 cout<<dui[head][3]+1; 62 return ; 63 } 64 65 if( sou(g) ) { 66 67 //cin>>oo; 68 dui[++tail][1]=xx; 69 dui[tail][2]=yy; 70 dui[tail][3]=dui[head][3]+1; 71 dui[tail][4]=u; 72 cout<<xx<<" "<<yy<<" "<<dui[tail][3]<<" "<<g<<endl; 73 } 74 swap( kkk[dui[head][4]].a[xx][yy], kkk[u].a[dui[head][1]][dui[head][2]] ); 75 } 76 } 77 } 78 } 79 int main(){ 80 for (int i=0 ; i<=2 ; i++) 81 for(int j=0 ; j<=2 ; j++){ 82 cin >> kkk[2].a[i][j]; 83 aa = aa*10 + kkk[2].a[i][j]; 84 if( kkk[2].a[i][j] == 9 ) k1 = i , k2 = j; 85 } 86 for ( int i=0 ; i<=2 ; i++) 87 for( int j=0 ; j<=2 ; j++){ 88 cin >> kkk[1].a[i][j]; 89 bb = bb*10 + kkk[1].a[i][j]; 90 } 91 h[ aa%NUM ] = aa; 92 head=0;tail=1; 93 dui[1][1]=k1,dui[1][2]=k2,dui[1][3]=0,dui[1][4]=2; 94 search(2); 95 return 0; 96 } 97 98 99 //BFS邻接矩阵版 100 int vis[maxn]; 101 int Edge[maxn][maxn]; 102 103 while (rear-front+1 != 0) { 104 int u = Queue[front ++]; 105 for (int i = 1; i <= n; ++ i) if (Edge[u][i] == true) { 106 int v = i; 107 if (vis[v] == false) { 108 push(v); 109 } 110 } 111 }