dfs实现出了奇怪的锅

P1462 通往奥格瑞玛的道路

tgs9311 @ 2020-08-10 20:47:58

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace FAST_IO
{
    template<typename T> void read(T &a)
    {
        a=0;
        int f=1;
        char c=getchar();
        while(!isdigit(c))
        {
            if(c=='-')
            {
                f=-1;
            }
            c=getchar();
        }
        while(isdigit(c))
        {
            a=a*10+c-'0';
            c=getchar();
        }
        a=a*f;
    }
    template <typename T> void write(T a)
    {
        if(a<0)
        {
            a=-a;
            putchar('-');
        }
        if(a>9)
        {
            write(a/10);
        }
        putchar(a%10+'0');
    }
    template <typename T> void writeln(T a)
    {
        write(a);
        puts("");
    }
}
int n,m,b;
int price[10001];
vector<pair<int,int> > g[50001];
int vis[10001];
void dfs(int mi,int now,int nowbl)
{
    for(int i=0;i<g[now].size();i++)
    {
        //cout<<now<<" "<<vis[g[now][i].first]<<" "<<price[vis[g[now][i].first]]<<" "<<nowbl-g[now][i].second<<endl;
        if(!vis[g[now][i].first]&&price[g[now][i].first]<=mi&&nowbl-g[now][i].second>=0)
        {
            //cout<<now<<" "<<g[now][i].first<<endl;
            vis[g[now][i].first]=true;
            dfs(mi,g[now][i].first,nowbl-g[now][i].second);
        }
    }
}
bool check(int mi)
{
    if(price[1]>mi)
    {
        return false;
    }
    for(int i=1;i<=n;i++)
    {
        vis[i]=false;
    }   
    vis[1]=true;
    dfs(mi,1,b);    
    return vis[n];
}
signed main()
{
    cin>>n>>m>>b;
    for(int i=1;i<=n;i++)
    {
        cin>>price[i];
    }
    for(int i=1;i<=m;i++)
    {
        int from,to,blood;
        cin>>from>>to>>blood;
        g[from].push_back(make_pair(to,blood));
        g[to].push_back(make_pair(from,blood));
    }
    //cout<<check(0);
    //system("pause");
    int l=0,r=INT_MAX,mid,ans=-1;
    while(l<=r)
    {
        mid=l+r>>1;
        //cout<<l<<" "<<r<<" "<<mid<<endl;
        if(check(mid))
        {
            ans=mid;
            r=mid-1;
        }
        else
        {
            l=mid+1; 
        }
    }
    if(ans==-1)
    {
        cout<<"AFK";
    }
    else
    {
        cout<<ans;
    }
}

64分求助


by michael_song @ 2020-08-10 20:56:04

这道题不是一道二分最短路吗

用dfs求最短路会出很多奇奇怪怪的问题


by tgs9311 @ 2020-08-10 21:02:57

@michael_song 不用最短路吧,判断路径存在性就行了


by tgs9311 @ 2020-08-10 21:17:36

最短路过了但是我还是想知道这个dfs哪错了(


by AT·小苏苏 @ 2020-08-10 21:17:54

@tgs9311 我以前也有这种情况,判能不能到,用的dfs,但是dfs就会给你走一条长一些的道路,导致本来能到的点判断为走不到,如果是纯暴搜时间复杂度又不如最短路

你是wa,应该是被dfs坑了

最好用最短路,真的


by tgs9311 @ 2020-08-10 21:21:04

@AT·小苏苏 我看题解有人用dfs过了但是用的邻接表,而且我老师给我发的三种做法里面就有一种是二分+dfs但是他没给我标程


by AT·小苏苏 @ 2020-08-11 07:57:26

@tgs9311

那我学疏才浅,看不出来dfs出了什么锅

但是你这dfs的核心思想依然是Dijkstra的啊 还不如干脆用dijkstra


by AT·小苏苏 @ 2020-08-11 08:00:20

反正我的经验之谈是能用最短路千万别用dfs,会不明不白的WA


|