齒輪[帶權並查集好題]
阿新 • • 發佈:2018-12-02
我們發現如果a與b的轉比為k1 , b與c的轉比為k2 , 那麼a與c的轉比為 k1*k2
我們並查集判連通性時 , 順便維護一個dis , dis[x]表示dis與rt的轉比
維護dis時 , 每次都乘上fa的dis就可以了 , 注意dis初始值為1
當出現環時 , 如果u與v的轉比等於x/y就是合法的 , 發現u與v的轉比就是dis[u]/dis[v]
判斷一下就好
#include<bits/stdc++.h> #define N 1050 using namespace std; int fa[N],n,m,T,cnt; double d[N]; int find(int x){ if(x==fa[x]) return x; int rt=find(fa[x]); d[x] *= d[fa[x]]; return fa[x]=rt; } int main(){ cin>>T; while(T--){ cin>>n>>m; int flag=0; for(int i=1;i<=n;i++) fa[i]=i,d[i]=1; for(int i=1;i<=m;i++){ int u,v,x,y; scanf("%d%d%d%d",&u,&v,&x,&y); if(find(u)==find(v)){ if(fabs((d[u]/d[v]) - ((x*1.0)/(y*1.0))) >= 1e-8) {flag=1; break;} } else{ d[v]= (y*1.0)/(x*1.0); fa[v]=u; } } if(!flag) printf("Case #%d: Yes\n",++cnt); else printf("Case #%d: No\n",++cnt); }return 0; }