学长的临接表代码

单向临接表
 
 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 }

 

posted @ 2018-08-11 08:29  GCCCC  阅读(259)  评论(0)    收藏  举报