1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std;
typedef long long LL;
const int maxn=305, maxm=1e5+5; const LL mo=1e9+7;
int n,m,u[maxm],v[maxm],w[maxm];
LL mi(LL x,LL y) { LL re=1; for(; y; y>>=1, x=x*x%mo) if (y&1) re=re*x%mo; return re; }
LL D,J[maxn][maxn]; void Det() { D=1; fo(i,1,n-1) { fo(j,i,n-1) if (J[j][i]!=0) { swap(J[i],J[j]); if (i!=j) D*=-1; break; } fo(j,i+1,n) { LL c=J[j][i]*mi(J[i][i],mo-2)%mo; fo(k,i,n) (J[j][k]-=c*J[i][k])%=mo; } } fo(i,1,n-1) (D*=J[i][i])%=mo; D=(D+mo)%mo; }
LL G[maxn][maxn],Gc[maxn][maxn],c[maxn]; void Gauss() { fo(i,1,n) { fo(j,i,n) if (G[j][i]!=0) { swap(G[i],G[j]), swap(Gc[i],Gc[j]); break; } LL c=mi(G[i][i],mo-2); fo(j,1,n) (G[i][j]*=c)%=mo, (Gc[i][j]*=c)%=mo; fo(j,1,n) if (j!=i) { LL c=G[j][i]; fo(k,1,n) (G[j][k]-=c*G[i][k])%=mo, (Gc[j][k]-=c*Gc[i][k])%=mo; } } } void Pre() { fo(i,1,n) { Gc[i][i]=1; fo(j,1,n) G[i][j]=J[j][i]; } Gauss(); }
int main() { scanf("%d %d",&n,&m); fo(i,1,m) { scanf("%d %d %d",&u[i],&v[i],&w[i]); J[u[i]][u[i]]++; J[u[i]][v[i]]--; } Pre(); Det(); LL ans=0; fo(i,1,m) if (u[i]<n) { LL x=(Gc[u[i]][u[i]]-Gc[u[i]][v[i]])%mo; (ans+=D*x%mo*w[i])%=mo; } printf("%lld\n",(ans+mo)%mo); }
|