欧拉回路 实现重边和只满足简单图的代码

  1 //这个方法只能是简单图,重边无法处理:
  2 
  3 #include<iostream>
  4 
  5 #include<math.h>
  6 
  7 #include<string.h>
  8 
  9 #include<time.h>
 10 
 11 #include<stdio.h>
 12 
 13 #include<cstdlib>
 14 
 15 #include <malloc.h>
 16 
 17 #include<queue>
 18 
 19 #include<stack>
 20 
 21 #include<windows.h>//使用Sleep()
 22 
 23 using namespace std;
 24 
 25 const int MAXN = 1000;
 26 
 27 int n, m, G[MAXN][MAXN], vis[MAXN][MAXN];
 28 
 29 void euler(int u)//从u顶点开始
 30 
 31 {
 32 
 33 for(int i=0;i<n;i++)  
 34 
 35 {   
 36 
 37 if(G[u][i]&&!vis[u][i])   
 38 
 39 {    
 40 
 41 vis[u][i]=vis[i][u]=1;    
 42 
 43 cout<<"("<<u<<","<<i<<")"<<endl;    
 44 
 45 euler(i);   
 46 
 47 }  
 48 
 49 }
 50 
 51 }
 52 
 53 int main(int argc, char* argv[])
 54 
 55 {  
 56 
 57 memset(G,0,sizeof(G));  
 58 
 59 memset(vis,0,sizeof(vis));
 60 
 61 cout<<"多少个点:"<<endl;  
 62 
 63 cin>>n;
 64 
 65  cout<<"多少条边:"<<endl;  
 66 
 67 cin>>m;
 68 
 69 int v1;  
 70 
 71 int v2;
 72 
 73  for(int i=0;i<m;i++)
 74 
 75  {   
 76 
 77 cin>>v1>>v2;   
 78 
 79 G[v1][v2]=G[v2][v1]=1;  
 80 
 81 }  
 82 
 83 euler(0);
 84 
 85 ::system("pause");
 86 
 87  return 0;
 88 
 89 }
 90 
 91  
 92 
 93  
 94 
 95  96 
 97  
 98 
 99 以下实现重边情况:
100 
101 #include<iostream>
102 
103 #include<math.h>
104 
105 #include<string.h>
106 
107 #include<time.h>
108 
109 #include<stdio.h>
110 
111 #include<cstdlib>
112 
113 #include <malloc.h>
114 
115 #include<queue>
116 
117 #include<stack>
118 
119 #include<windows.h>//使用Sleep()
120 
121 using namespace std;
122 
123 const int MAXN = 1000;
124 
125 int n, m, G[MAXN][MAXN], can_vis[MAXN][MAXN];
126 
127 void euler(int u)//从u顶点开始
128 
129 {
130 
131 for(int i=0;i<n;i++)
132 
133 {   
134 
135 if(G[u][i]&&can_vis[u][i])   
136 
137 {    
138 
139 can_vis[u][i]=--can_vis[i][u];    
140 
141 cout<<"("<<u<<","<<i<<")"<<endl;    
142 
143 euler(i);   
144 
145 }
146 
147 }
148 
149 }
150 
151 int main(int argc, char* argv[])
152 
153 {
154 
155 memset(G,0,sizeof(G));
156 
157 memset(can_vis,0,sizeof(can_vis));
158 
159 cout<<"多少个点:"<<endl; cin>>n;
160 
161 cout<<"多少条边:"<<endl; cin>>m;
162 
163 int v1;
164 
165 int v2;
166 
167 for(int i=0;i<m;i++)
168 
169 {   
170 
171 cin>>v1>>v2;   
172 
173 G[v1][v2]=++G[v2][v1];
174 
175 }
176 
177 for(int i=0;i<MAXN;i++)
178 
179 {   
180 
181 for(int j=0;j<MAXN;j++)   
182 
183 {    
184 
185 can_vis[i][j]=G[i][j];   
186 
187 }
188 
189 }
190 
191 euler(0);
192 
193 ::system("pause");
194 
195 return 0;
196 
197 }
View Code

 

posted on 2013-07-10 23:39  Forgiving  阅读(188)  评论(0编辑  收藏  举报