【2018/09/08測試T3】【WOJ 3933】觀光旅行
阿新 • • 發佈:2019-01-24
【題目】
【分析】
這道題和我之前寫過的一道題比較像戳這裡看題
不同點是:1、道路改成雙向的了;2、題目要求出方案數
雖說有這樣的不同,但是思路還是一樣的,我就不贅述了,具體看程式碼吧
【程式碼】
#include<cstdio> #include<cstring> #include<algorithm> #define N 50005 #define M 200005 #define mod 1000000007 using namespace std; struct edge { int u,v,w; }a[M]; int f[N],g[N],tf[N],tg[N]; bool comp(const edge &p,const edge &q) { return p.w<q.w; } int main() { int n,m,i,j,last=0; scanf("%d%d",&n,&m); for(i=1;i<=m;++i) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w); sort(a+1,a+m+1,comp); fill(g+1,g+n+1,1); int ans=0,res=0; for(i=1;i<=m;++i) { if(a[i].w!=a[i+1].w||i==m) { for(j=last+1;j<=i;++j) { tf[a[j].u]=f[a[j].u];tg[a[j].u]=g[a[j].u]; tf[a[j].v]=f[a[j].v];tg[a[j].v]=g[a[j].v]; } for(j=last+1;j<=i;++j) { if(tf[a[j].u]+1>f[a[j].v]) f[a[j].v]=tf[a[j].u]+1,g[a[j].v]=tg[a[j].u]; else if(tf[a[j].u]+1==f[a[j].v]) g[a[j].v]=(g[a[j].v]+tg[a[j].u])%mod; if(tf[a[j].v]+1>f[a[j].u]) f[a[j].u]=tf[a[j].v]+1,g[a[j].u]=tg[a[j].v]; else if(tf[a[j].v]+1==f[a[j].u]) g[a[j].u]=(g[a[j].u]+tg[a[j].v])%mod; ans=max(ans,max(f[a[j].u],f[a[j].v])); } last=i; } } printf("%d\n",ans); for(i=1;i<=n;++i) if(f[i]==ans) res=(res+g[i])%mod; printf("%d",res); return 0; }