求助...

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <map>
#include <math.h>
#include <set>
#include <vector>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb push_back
typedef long long ll;
const ll inf=132913423200339;
const ll mod=998244353676776;
const ll N=2e5+5;
const ll M=10+5;
const double eps=1e-7;
using namespace std;
ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b) { return a*b/gcd(a,b);    }
ll qp(ll a,ll b, ll p){ll ans = 1;while(b){if(b&1){ans = (ans*a)%p;--b;}a = (a*a)%p;b >>= 1;}return ans%p;}
ll Inv(ll x)          { return qp(x,mod-2,mod);}
ll C(ll n,ll m){if (m>n) return 0;ll ans = 1;for (int i = 1; i <= m; ++i) ans=ans*Inv(i)%mod*(n-i+1)%mod;return ans%mod;}
ll A(ll n,ll m,ll mod){ll sum=1; for(int i=n;i>=n-m+1;i--) sum=(sum*i)%mod; return sum%mod;}
ll lowbit(ll x) {return x&(-x);}
ll c[N],sum1[N],sum2[N],b[N],lsh[N],n,m,fa[13],a[N];
void add1(ll i,ll k){ while(i<=n) {c[i]+=k;i+=lowbit(i);}}//预处理ai单点修改 区间查询***预处理a[i]-a[i-1]区间修改单点查询
ll  Sum1(ll i) {ll res=0; while(i>0) res+=c[i],i-=lowbit(i);return res;}//预处理ai单点修改 区间查询***预处理a[i]-a[i-1]区间修改单点查询
void add2(ll i,ll k){ ll x=i;while(i<=n) {sum1[i]+=k;sum2[i]+=k*(x-1);i+=lowbit(i);}}//区间修改,区间查询
ll  Sum2(ll i) {ll res=0,x=i;while(i>0){ res+= x * sum1[i]-sum2[i]; i -= lowbit(i);}return res;}//区间修改,区间查询
void ls(){ll cnt; for(ll i=1;i<=n;i++) lsh[i]=a[i]; sort(lsh+1,lsh+n+1);cnt = unique(lsh+1,lsh+n+1)-lsh-1; for(int i=1;i<=n;i++)a[i]=lower_bound(lsh+1,lsh+cnt+1,a[i])-lsh;}
ll lca(ll x) { if(x==fa[x]) return x;else return fa[x]=lca(fa[x]); }//找祖先.
struct dd{
    ll son,val;
};
vector<dd>v1[N];//从1开始的dfs.记录到1的最小代价
vector<dd>v2[N];//从n开始的dfs.记录到n的最小代价
ll dp1[N];//记录该点到1的最小代价..
ll dp2[N];//记录该点到n的最小代价..
ll cnt1[N];
ll cnt2[N];
ll cnt3[N];
ll vis1[N];
ll vis2[N];
void dfs1(ll x,ll fa)
{
    vis1[x]=1;
   // cout<<1<<endl;
    for(ll i=0;i<v1[x].size();i++)
    {
        ll so=v1[x][i].son;
        if(vis1[so]) continue;
        ll va=v1[x][i].val;
        dp1[so]=min(dp1[so],dp1[x]+va);
        dfs1(so,x);
    }
    vis1[x]=0;
}
void dfs2(ll x,ll fa)
{
    vis2[x]=1;
    for(ll i=0;i<v2[x].size();i++)
    {
        ll so=v2[x][i].son;
        if(vis2[so]) continue;
        ll va=v2[x][i].val;
        dp2[so]=min(dp2[so],dp2[x]+va);
        dfs2(so,x);
    }
    vis2[x]=0;
}
int main()
{
    ios;
    cin>>n>>m;
    for(ll i=0;i<=n+1;i++) dp1[i]=inf,dp2[i]=inf;
    for(ll i=1;i<=m;i++)
    {
        ll x,y,z;
        cin>>cnt1[i]>>cnt2[i]>>cnt3[i];
        x=cnt1[i];y=cnt2[i];z=cnt3[i];
        v1[x].push_back(dd{y,z});
        v2[y].push_back(dd{x,z});
    }
    dp1[1]=0;dp2[n]=0;
    dfs1(1,0);dfs2(n,0);
    ll q;
    cin>>q;
    while(q--)
    {
        ll x;
        cin>>x;
        //dp2[1]是最低代价了.
       // cout<<dp2[1]<<endl;
        if(dp1[cnt2[x]]+dp2[cnt1[x]]+cnt3[x]<dp2[1]) cout<<"YES"<<endl;
        else                                         cout<<"NO"<<endl;
      //  cout<<dp1[cnt2[x]]+dp2[cnt1[x]]+cnt3[x]<<endl;
    }
    return 0;
}
为什么这个代码会t啊...
全部评论
这个dfs复杂度批爆吧  你换dj试试
点赞 回复 分享
发布于 2020-04-13 14:08
帮我送杯子
点赞 回复 分享
发布于 2020-04-13 13:43
https://ac.nowcoder.com/acm/contest/5026/D这是题目链接
点赞 回复 分享
发布于 2020-04-13 13:13

相关推荐

09-18 14:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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