码迷,mamicode.com
首页 > 其他好文 > 详细

暴力法求最小生成树

时间:2017-09-16 20:38:23      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:for   def   using   its   style   code   ++   com   inf   

暴力法求最小生成树

技术分享

5 7
1 2 2
2 5 2
1 3 4
1 4 7
3 4 1
2 3 1
3 5 6

我们采用的是dfs的回溯暴力,所以对于如下图,只能搜索到3条路,就是那种dfs的路。

思路:

暴力求最小生成树
求这个图的最小生成树
我就要看有多少个点被选进去了,vis数组就好,并且用个n来表示已经被选的点的个数
然后记录所以已经选了的路径和

技术分享

技术分享

技术分享

 1 #include <bits/stdc++.h>
 2 #define INFINITE 0x3fffffff
 3 using namespace std;
 4 struct node{
 5     int v;
 6     int w;
 7     node(int v,int w){
 8         this->v=v;
 9         this->w=w;
10     } 
11 };
12 vector<node> vec[100];
13 int edgeNum[100];
14 int n,m;
15 bool vis[100];
16 
17 int minDis=INFINITE; 
18 
19 
20 void addEdge(int u,int v,int w){
21     edgeNum[u]++;
22     vec[u].push_back(node(v,w));
23 }
24 
25 void init(){
26     cin>>n>>m;
27     for(int i=1;i<=m;i++){
28         int u,v,w;
29         cin>>u>>v>>w;
30         addEdge(u,v,w);
31         addEdge(v,u,w);
32     }
33 }
34 
35 /*
36 暴力求最小生成树
37 求这个图的最小生成树
38 我就要看有多少个点被选进去了,vis数组就好,并且用个n来表示已经被选的点的个数 
39 然后记录所以已经选了的路径和 
40 */
41 //记录起点,记录选了个点 
42 void search(int start,int dis,int cur){
43     //边界一定要清楚 
44     //而且这里是5不是6 
45     if(cur==5){//这里写成n==n 第几错误傻逼错误满天飞 
46         cout<<dis<<endl;
47         if(dis<minDis){
48             minDis=dis;
49         }
50         return ;
51     } 
52     for(int i=0;i<edgeNum[start];i++){
53         
54         int v=vec[start][i].v;
55         int w=vec[start][i].w;
56         //cout<<vis[v]<<endl; 
57         if(!vis[v]){
58             cout<<start<<" "<<v<<" "<<w<<endl;
59             vis[v]=true;
60             search(v,dis+w,cur+1);
61             vis[v]=false;
62         }
63         
64     }
65 } 
66 
67 
68 int main(){
69     freopen("in.txt","r",stdin);
70     init();
71     vis[1]=true;//这句话居然在search下面 
72     search(1,0,1); 
73     
74     cout<<minDis<<endl;
75     return 0;
76 } 

上述代码再说几点

1、上述代码并不能解决最小生成树,只能求出DFS的最小生成树情况,所以还需要其它的暴力方法

2、回溯有问题

3、回溯的边界请想清楚

4、变量的初始值请想清楚,dis初始时0不是INFINITE

5、第71行我开始居然写到了72行之下

6、写代码太不专心了,傻逼错误太多了

7、第45行也是

 

代码2,把回溯中的变量dis写在了外面,更好理解回溯

 1 #include <bits/stdc++.h>
 2 #define INFINITE 0x3fffffff
 3 using namespace std;
 4 struct node{
 5     int v;
 6     int w;
 7     node(int v,int w){
 8         this->v=v;
 9         this->w=w;
10     } 
11 };
12 vector<node> vec[100];
13 int edgeNum[100];
14 int n,m;
15 bool vis[100];
16 int dis=0; 
17 int minDis=INFINITE; 
18 
19 
20 void addEdge(int u,int v,int w){
21     edgeNum[u]++;
22     vec[u].push_back(node(v,w));
23 }
24 
25 void init(){
26     cin>>n>>m;
27     for(int i=1;i<=m;i++){
28         int u,v,w;
29         cin>>u>>v>>w;
30         addEdge(u,v,w);
31         addEdge(v,u,w);
32     }
33 }
34 
35 /*
36 暴力求最小生成树
37 求这个图的最小生成树
38 我就要看有多少个点被选进去了,vis数组就好,并且用个n来表示已经被选的点的个数 
39 然后记录所以已经选了的路径和 
40 */
41 //记录起点,记录选了个点 
42 void search(int start,int cur){
43     //边界一定要清楚 
44     //而且这里是5不是6 
45     if(cur==5){//这里写成n==n 第几错误傻逼错误满天飞 
46         cout<<dis<<endl;
47         if(dis<minDis){
48             minDis=dis;
49         }
50         return ;
51     } 
52     for(int i=0;i<edgeNum[start];i++){
53         
54         int v=vec[start][i].v;
55         int w=vec[start][i].w;
56         //cout<<vis[v]<<endl; 
57         if(!vis[v]){
58             cout<<start<<" "<<v<<" "<<w<<endl;
59             vis[v]=true;
60             dis+=w;
61             search(v,cur+1);
62             dis-=w;
63             vis[v]=false;
64         }
65         
66     }
67 } 
68 
69 
70 int main(){
71     freopen("in.txt","r",stdin);
72     init();
73     vis[1]=true;//这句话居然在search下面 
74     search(1,1); 
75     
76     cout<<minDis<<endl;
77     return 0;
78 } 

技术分享

 

暴力法求最小生成树

标签:for   def   using   its   style   code   ++   com   inf   

原文地址:http://www.cnblogs.com/Renyi-Fan/p/7532175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!