标签: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