版权声明:转载请声明出处,谢谢配合。 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;
}