首页 > 代码库 > Bzoj4602--Sdoi2016齿轮

Bzoj4602--Sdoi2016齿轮

可以用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;
}

 

Bzoj4602--Sdoi2016齿轮