可以用dfs做,但是精度会有点炸,之后就是各种取对数或者模意义下的运算。。。
不过这道题可以用long double水过去。。。- -|
代码:
#include<bits/stdc++.h> using namespace std; inline double _fabs(double a) {return a>0?a:-a;} #define MAXN 1005 #define MAXM 10005 const double eps=1e-9; inline int read() { int ret=0,f=1;char c=getchar(); while(c>‘9‘||c<‘0‘) {if(c==‘-‘) f=-1;c=getchar();} while(c<=‘9‘&&c>=‘0‘) {ret=ret*10+c-‘0‘;c=getchar();} return ret*f; } int T,n,m; long double r[MAXN];bool vis[MAXN]; int head[MAXN],cnt; struct Edge{ int to,next,x,y; }e[MAXM*2]; inline void insert(int a,int b,int x,int y) { e[++cnt].next=head[a];head[a]=cnt;e[cnt].to=b;e[cnt].x=x;e[cnt].y=y; e[++cnt].next=head[b];head[b]=cnt;e[cnt].to=a;e[cnt].x=y;e[cnt].y=x; } int a[MAXM],b[MAXM],x[MAXM],y[MAXM]; void init() { memset(head,0,sizeof(head));cnt=0; memset(vis,0,sizeof(vis));memset(r,0,sizeof(r)); } void dfs(int v) { vis[v]=1; for(int i=head[v];i;i=e[i].next) if(!vis[e[i].to]) { r[e[i].to]=r[v]/e[i].x*e[i].y; dfs(e[i].to); } } int main() { T=read(); for(int p=1;p<=T;p++) { n=read();m=read(); init();bool flag=0; for(int i=1;i<=m;i++) { a[i]=read();b[i]=read();x[i]=read();y[i]=read(); insert(a[i],b[i],x[i],y[i]); } for(int i=1;i<=n;i++) if(!vis[i]) r[i]=1,dfs(i); printf("Case #%d: ",p); for(int i=1;i<=m;i++) if(_fabs(r[a[i]]*y[i]-r[b[i]]*x[i])>eps) {puts("No");flag=1;break;} if(!flag) puts("Yes"); } return 0; }
时间: 2024-10-29 15:04:03