题目连接
题解:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<queue>
#define ll long long
#define pr make_pair
#define pb push_back
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e15;
const int mod=1e9+7;
const double eps=1e-8;
const int maxn=310;
ll a[maxn][maxn];
int n,m,t;
ll mypow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
ll Gu(int n)
{
ll res=1;
for(int i=2;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(a[j][i]!=0)
{
if(j!=i)
{
res=-res;
for(int k=i;k<=n;k++)
swap(a[i][k],a[j][k]);
}
break;
}
}
if(a[i][i]==0) return 0;
res=res*a[i][i]%mod;
ll inv=mypow(a[i][i],mod-2);
for(int j=i+1;j<=n;j++)
{
int tmp=a[j][i]*inv%mod;
for(int k=i;k<=n;k++)
a[j][k]=(a[j][k]-tmp*a[i][k]%mod+mod)%mod;
}
}
return abs(res);
}
int main(void)
{
scanf("%d%d%d",&n,&m,&t);
ll x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
if(t)
{
a[y][y]=(a[y][y]+z)%mod;
a[x][y]=(a[x][y]-z+mod)%mod;
}
else
{
a[x][x]=(a[x][x]+z)%mod;
a[y][y]=(a[y][y]+z)%mod;
a[x][y]=(a[x][y]-z+mod)%mod;
a[y][x]=(a[y][x]-z+mod)%mod;
}
}
printf("%lld\n",Gu(n));
return 0;
}