暴力求最短路
暴力求最短路
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);
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2024-10-30:27岁,宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
AI交流资料群:753014672