• 暴力求最短路


    暴力求最短路

    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); 

  • 相关阅读:
    文件I/O(二)
    linux学习之文件I/O篇(一)
    静态库和共享库
    vim-ide
    CentOS6 vsftpd 安装及优化方法
    Redmine2.5+CentOS6+Apache2
    分享一个TP5实现Create()方法的心得
    Windows证书的生成导出以及使用证书验证文件是否被修改
    如何设置程序UAC控制
    关于C#的可变长参数
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7531544.html
Copyright © 2020-2023  润新知