暴力求最短路

暴力求最短路

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

思路:

求1-5的最短距离
找所有1可以直接到达的点,从这些点再去找5,并且记录我现在已经走了的长度
如果找打5,就比较最短路
输出最短路的最优值
在某条路中,点被走过,就不能再走了

 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 minDis=INFINITE;
17 
18 void addEdge(int u,int v,int w){
19     edgeNum[u]++;
20     vec[u].push_back(node(v,w));
21 }
22 
23 void init(){
24     cin>>n>>m;
25     for(int i=1;i<=m;i++){
26         int u,v,w;
27         cin>>u>>v>>w;
28         addEdge(u,v,w);
29         addEdge(v,u,w);
30     }
31 }
32 
33 //求1-5的最短距离
34 //找所有1可以直接到达的点,从这些点再去找5,并且记录我现在已经走了的长度
35 //如果找打5,就比较最短路
36 //输出最短路的最优值
37 //在某条路中,点被走过,就不能再走了 
38 void search(int start,int dis,int end){
39     if(dis>=minDis) return ;//最优化剪枝 
40     
41     if(start==end){
42         //检查错误,这一句话就够了 
43         //cout<<dis<<endl; 
44         if(dis<minDis) minDis=dis;
45         return ;
46     }    
47     for(int i=0;i<edgeNum[start];i++){
48         int v=vec[start][i].v;
49         int w=vec[start][i].w;
50         if(!vis[v]){
51             vis[v]=true;
52             search(v,dis+w,end);
53             vis[v]=false;
54         }             
55         
56     }
57     
58 }
59 
60 int main(){
61     freopen("in.txt","r",stdin);
62     init();
63     search(1,0,4); 
64     vis[1]=true;
65     cout<<minDis<<endl; 
66     return 0;
67 } 
暴力求最短路

1、想好算法再行动

2、检查错误,关键位置的一句话就够了,要机智

3、回溯模板

4、回溯应该写在if里面 

5、vis[1]=true;//这句话居然在search下面     search(1,0,1); 

原文地址:https://www.cnblogs.com/Renyi-Fan/p/7531544.html