zoukankan      html  css  js  c++  java
  • [BZOJ]4238: 电压

     题解: 一眼看过去  大讨论题?  什么奇偶环讨论下?   然后仔细考虑一下  我们对于所有的边分成树边和非树边  对于所有的非树边  能形成奇环的在路径上的边+1  形成偶环的路径上-1  然后看边上权值等于奇环数量的就是可以被选择的.....不用其他高级数据结构维护  看了discuss好像带log会T...那就老实在 u,v节点和 其lca位置打上标记 做个差分就可以求出每条边的权值 然后统计贡献即可

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <set>
    #include <map>
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define link(x) for(edge *j=h[x];j;j=j->next)
    #define inc(i,l,r) for(int i=l;i<=r;i++)
    #define dec(i,r,l) for(int i=r;i>=l;i--)
    const int MAXN=3e5+10;
    const double eps=1e-8;
    #define ll long long
    using namespace std;
    struct edge{int t;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
    void add(int x,int y){o->t=y;o->next=h[x];h[x]=o++;}
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    int n,m;
    typedef struct node{
        int u,v;
    }node;
    vector<node>vec;
    int f[MAXN];
    int fa[MAXN],son[MAXN],num[MAXN],dep[MAXN];
    int sum[MAXN];
    
    int find1(int x){
        if(x==f[x])return x;
        else return f[x]=find1(f[x]);
    }
    void dfs(int x,int pre,int deep){
        fa[x]=pre;num[x]=1;dep[x]=deep+1;
        link(x){
    	if(j->t==pre)continue;
    	dfs(j->t,x,deep+1);
    	num[x]+=num[j->t];
    	if(son[x]==-1||num[son[x]]<num[j->t])son[x]=j->t;
        }
    }
    int tp[MAXN];
    void dfs1(int x,int td){
        tp[x]=td;
        if(son[x]!=-1)dfs1(son[x],td);
        link(x)if(j->t!=son[x]&&j->t!=fa[x])dfs1(j->t,j->t);
    }
    
    int Lca(int x,int y){
        int xx=tp[x];int yy=tp[y];
        while(xx!=yy){
    	if(dep[xx]<dep[yy])swap(xx,yy),swap(x,y);
    	x=fa[xx];xx=tp[x];
        }
        if(dep[x]>dep[y])swap(x,y);
        return x;
    }
    
    void dfs2(int x){
        link(x){
    	if(j->t==fa[x])continue;
    	dfs2(j->t);
    	sum[x]+=sum[j->t];
        }
    }
    
    bool vis[MAXN];
    int main(){
        n=read(),m=read();
        inc(i,1,n)f[i]=i,son[i]=-1;
        int u,v;
        while(m--){
    	u=read();v=read();
    	int t1=find1(u);int t2=find1(v);
    	if(t1==t2){vec.pb((node){u,v});continue;}
    	f[t1]=t2;add(u,v);add(v,u);
        }
        inc(i,1,n)if(!dep[i])dfs(i,0,0),dfs1(i,i),vis[i]=1,sum[i]=-1;
        int cnt=0;
        for(int i=0;i<vec.size();i++){
    	u=vec[i].u;v=vec[i].v;
    	if(u>v)swap(u,v);
    	int lca=Lca(u,v);
    	int t=dep[u]+dep[v]-2*dep[lca]+1;
    	if(t&1){
    	    cnt++,sum[u]++,sum[v]++,sum[lca]-=2;
    	}
    	else sum[u]--,sum[v]--,sum[lca]+=2;
        }
        int ans=0;
        if(cnt==1)ans++;
        inc(i,1,n)if(vis[i])dfs2(i);
        inc(i,1,n)if(cnt==sum[i])ans++;
        printf("%d
    ",ans);
    }
    

      

    4238: 电压

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 567  Solved: 252
    [Submit][Status][Discuss]

    Description

    你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)”。这里简称为JOI社。
    JOI社的某个实验室中有着复杂的电路。电路由n个节点和m根细长的电阻组成。节点被标号为1~N
    每个节点有一个可设定的状态【高电压】或者【低电压】。每个电阻连接两个节点,只有一端是高电压,另一端是低电压的电阻才会有电流流过。两端都是高电压或者低电压的电阻不会有电流流过。
    某天,JOI社为了维护电路,选择了一根电阻,为了能让【只有这根电阻上的电流停止流动,其他M-1根电阻中都有电流流过】,需要调节各节点的电压。为了满足这个条件,能选择的电阻共有多少根?
    对了,JOI社这个奇妙的电路是用在什么样的发明上的呢?这是公司内的最高机密,除了社长以外谁都不知道哦~
    现在给出电路的信息,请你输出电路维护时可以选择使其不流的电阻的个数。

    Input

    第一行两个空格分隔的正整数N和M,表示电路中有N个节点和M根电阻。
    接下来M行,第i行有两个空格分隔的正整数Ai和Bi(1<=Ai<=N,1<=Bi<=N,Ai≠Bi),表示第i个电阻连接节点Ai和节点Bi。

    Output

    输出一行一个整数,代表电路维护时可选择的使其不流的电阻个数。

    Sample Input

    4 4
    1 2
    2 3
    3 2
    4 3

    Sample Output

    2

     

  • 相关阅读:
    Kubernetes二进制文件下载链接
    Python 中取代 Printf 大法的工具
    Python 七步捉虫法
    改善 Python 程序的 91 个建议
    最全的 API 接口集合
    一个可能是世界上最全的 API 接口集合库开源项目
    优质中文NLP资源集合,做项目一定用得到!
    Flair:一款简单但技术先进的NLP库
    取代 Python 多进程!伯克利开源分布式框架 Ray
    使用 PyHamcrest 执行健壮的单元测试
  • 原文地址:https://www.cnblogs.com/wang9897/p/10357852.html
Copyright © 2011-2022 走看看