病毒问题dfs

使用dfs算法,先膜拜y哥,然后之间看代码吧,注释挺多的

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//题目来源: 
//https://ac.nowcoder.com/acm/contest/8053/G
//这道题是采用dfs,y哥牛逼 
const int N=120;//根据给的地图大小来定 
int path[N][N],minn=0x3f3f3f3f;//path用来存这个地图各个点的权值,而minn是int能达到的最大值,是为了优化时间, 
bool st[N][N];                // 最初我是用sum数组来存c的,但最后还需要遍历和比较,耗费时间,dfs传递的c是路径权值之和 
int n;                    //要开全局的,不然函数里边怎么比 
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};//对于每一个地图上的点,都有上下左右四个点 
void dfs(int a,int b,int c)
{
    if(a==n&&b==n)                        //先写跳出递归的条件 
    {
        minn=min(c,minn);
        return ;
    }
    if(c>minn) return ;                    //优化,减少时间,因为输出最小值 
    for(int i=0;i<4;i++)
    {
        int x=a+dx[i],y=b+dy[i];
        if(!st[x][y]&&path[x][y]>0&&x>0&&x<=n&&y>0&&y<=n)//遍历周围四个点 
        {
            c+=path[x][y];
            st[x][y]=true;
            dfs(x,y,c);                        //传递点和权值和 
            st[x][y]=false;                    //回溯还原 
            c-=path[x][y];
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n; 
    for(int i=1;i<=n;i++)
    {
        for(int k=1;k<=n;k++)
        {
            cin>>path[i][k];    
        }
    }
    st[1][1]=1;
    dfs(1,1,path[1][1]);
    if(minn==0x3f3f3f3f) 
    {
        cout<<"0"<<endl;
        return 0;
    }
    cout<<minn<<endl;
    return 0;
}
全部评论

相关推荐

认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
是每个人事都这样与找工作的人这样沟通吗?正常询问不可以吗
据说名字越长别人越关注你的昵称我觉得我要被关注了:excal 我还真不会
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务