-
F - 齿轮
- HYSBZ - 4602
- 题意:一些齿轮两两之间有相互关系,可以根据转动关系建图,然后判断是否矛盾。
-
#include<bits/stdc++.h> using namespace std; #define maxn 15555 int t,n,m,u,v,cnt,head[maxn]; double x,y,vis[maxn]; struct node { int v,to; double w; } edge[maxn*10]; void add(int u,int v,double w) { edge[++cnt].v=v; edge[cnt].w=w; edge[cnt].to=head[u]; head[u]=cnt; } bool dfs(int x,int pre) { for(int i=head[x]; i!=-1; i=edge[i].to) { int v=edge[i].v; if(v==pre)continue; if(fabs(vis[v]-0)>1e-7) { if(fabs(vis[v]-vis[x]*edge[i].w)>1e-7) { return 0; } } else { vis[v]=vis[x]*edge[i].w; if(dfs(v,x)==0) return 0; } } return 1; } int main() { scanf("%d",&t); for(int cas=1; cas<=t; cas++) { bool flag=0; memset(vis,0.0,sizeof(vis)); memset(head,-1,sizeof(head)); cnt=0; scanf("%d%d",&n,&m); while(m--) { scanf("%d%d%lf%lf",&u,&v,&x,&y); double temp=y/x; add(u,v,temp); temp=x/y; add(v,u,temp); } for(int i=1; i<=n; i++) { if(fabs(vis[i]-0)<1e-7) { vis[i]=1.0; if(dfs(i,-1)==0) { flag=1; break; } } } printf("Case #%d: ",cas); if(flag)printf("No\n"); else printf("Yes\n"); } return 0; }
F - 齿轮 HYSBZ - 4602 -矛盾关系判断-并查集-DFS
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/83820626
今日推荐
周排行