暴力求最短路
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 } 54 vis[v]=false; 55 } 56 57 } 58 59 int main(){ 60 freopen("in.txt","r",stdin); 61 init(); 62 search(1,0,4); 63 vis[1]=true; 64 cout<<minDis<<endl; 65 return 0; 66 }
1、想好算法再行动
2、检查错误,关键位置的一句话就够了,要机智
3、回溯模板
时间: 2024-11-01 13:34:40