【bzoj4602】[Sdoi2016]齿轮
dfs,连边,边权为比值,赋值搜索,遇到矛盾时退出
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; typedef double DB; #define eps 1e-8 #define M 10010 #define N 1010 struct edge { int to,next; DB a; }e[M<<1]; int head[M<<1]; int cnt; int T,n,m; int yjy; int x,y,u,v; int p[N<<1]; DB f[M<<1]; void link(int u,int v,DB x) { e[++cnt]=(edge){v,head[u],x}; head[u]=cnt; } int dfs(int x) { p[x]=1; for (int i=head[x];i!=-1;i=e[i].next) { int t=e[i].to; if (p[t]==0) { f[t]=f[x]*e[i].a; if (!dfs(t)) return 0; } else if ((f[x]*e[i].a-f[t])>eps) return 0; } return 1; } int main() { scanf("%d",&T); while (T--) { cnt=0; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) head[i]=-1,p[i]=0,f[i]=0; for (int i=1;i<=m;i++) { scanf("%d%d%d%d",&u,&v,&x,&y); link(v,u,1.0*x/y); link(u,v,1.0*y/x); } bool flag=false; for (int i=1;i<=n;i++) if (!p[i]) { f[i]=1.0; if (!dfs(i)) { flag=true; break ; } } printf("Case #%d: ",++yjy); if (!flag) printf("Yes\n"); else printf("No\n"); } return 0; }