2018.09.08【校内模拟】T3 观光旅行 Trip (DP)

版权声明:转载请声明出处,谢谢配合。 https://blog.csdn.net/zxyoi_dreamer/article/details/82531532

这里写图片描述
这里写图片描述


解析:

很先之前考过的一道题

这里就不解析了。


代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const

cs ll mod=1000000007;

inline
ll getint(){
    re ll num=0;
    re char c=gc();
    while(!isdigit(c))c=gc();
    while(isdigit(c))num=(num<<1)+(num<<3)+(c^48),c=gc();
    return num;
}

inline
void outint(ll a){
    static char ch[23];
    if(a==0)pc('0');
    if(a<0)pc('-'),a=-a;
    while(a)ch[++ch[0]]=(a-a/10*10)^48,a/=10;
    while(ch[0])pc(ch[ch[0]--]);
}

struct E{
    int u,v,w;
    friend bool operator<(cs E&a,cs E&b){
        return a.w>b.w;
    }
}e[200002];

inline
bool cmp(cs E &a,cs E &b){
    return a.w>b.w;
}

bool inq[50002];

int q[50002],qn;

ll anslen[50002];
ll anscnt[50002];

ll tmplen[50002];
ll tmpcnt[50002];

inline
void _copy(){
    for(int re i=1;i<=qn;++i){
        tmplen[q[i]]=anslen[q[i]];
        tmpcnt[q[i]]=anscnt[q[i]];
        inq[q[i]]=false;
    }
    qn=0;
}

int n,m;
int main(){
    n=getint();
    m=getint();
    for(int re i=1;i<=m;++i){
        e[i].u=getint();
        e[i].v=getint();
        e[i].w=getint();
    }
    for(int re i=1;i<=n;++i){
        anscnt[i]=tmpcnt[i]=1;
    }
    sort(e+1,e+m+1);
    for(int re i=1;i<=m;++i){
        if(e[i].w!=e[i-1].w)_copy();
        int u=e[i].u,v=e[i].v,w=e[i].w;
        if(anslen[u]<tmplen[v]+1){//use tmp to update ans
            anslen[u]=tmplen[v]+1;
            anscnt[u]=tmpcnt[v];
            if(!inq[u])q[++qn]=u,inq[u]=true;
        }
        else if(anslen[u]==tmplen[v]+1){
            anscnt[u]+=tmpcnt[v];
            if(anscnt[u]>=mod)anscnt[u]-=mod;
            if(!inq[u])q[++qn]=u,inq[u]=true;
        }
        if(anslen[v]<tmplen[u]+1){
            anslen[v]=tmplen[u]+1;
            anscnt[v]=tmpcnt[u];
            if(!inq[v])q[++qn]=v,inq[v]=true;
        }
        else if(anslen[v]==tmplen[u]+1){
            anscnt[v]+=tmpcnt[u];
            if(anscnt[v]>=mod)anscnt[v]-=mod;
            if(!inq[v])q[++qn]=v,inq[v]=true;
        }
    }
    ll len=0,cnt=0;
    for(int re i=1;i<=n;++i){
        if(len<anslen[i]){
            cnt=0;
            len=anslen[i];
        }
        if(len==anslen[i]){
            cnt+=anscnt[i];
            if(cnt>=mod)cnt-=mod;
        }
    }
    outint(len),pc('\n');
    outint(cnt),pc('\n');
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zxyoi_dreamer/article/details/82531532
今日推荐