zoukankan      html  css  js  c++  java
  • 【总结】图论小总结【题解】P1330封锁阳关大学

    【题解】【总结】P1330 封锁阳光大学 &&图论小总结

    这道题其实有一点点难度,不过我能经过思考做出来说明还是没有普及组(D1T1)难度的。

    考虑一条边的两边要有且仅有一个点被选中...这不就是染色吗?想到此,聪明的你一定就知道怎么做了。

    这题唯一的坑点就是不一定图是联通的,所以要(for)一下所有点去(bfs)

    这种题我还(wa)了一次,而且如果不是我下了数据还调不出来...

    思考一下为什么没有一遍过此题,还是因为思维不够完善。图论的题目,有什么坑点呢?在这里总结一下:

    • 图不联通。有这个图的连通性意识就不会被坑。这里包括了森林的情况。
    • 有自环的重边。这个是毒瘤出题人干的事情,不能被坑了。
    • 存在负环,要判断一下。
    • 树的根被指定了!
    • 边数可能比你想像的要多。
    • (spfa)已经死了QAQ!
    • (fr)(to)的位置调换了。凉心出题人!

    解决图论的问题,可以通过什么办法呢?

    • (Tarjin)求环求强连通分量。
    • 最短路算法。(还有那种取对数的)
    • 缩点+(DAG) (DP)
    • 拓扑排序
    • 并查集
    • 最小生成树,实际上和拟阵联系起来。
    • 树形(dp),实际上和上面那个很像的
    • 树上倍增。(lca),(st)表啊之类的。
    • 树上差分。我也不是很熟。
    • 点分治。解决树上路径计数问题等。
    • 树链剖分。同样也是树上路径,还可以顺便解决子树等问题。
    • 树上莫队。神奇的算法。
    • 正难则反!图论的题维护加边比较容易,维护减边就比较麻烦。反着来!
    • 网络流。(主要是建模难 QAQ)
    #include<bits/stdc++.h>
    
    using namespace std;
    #define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
    #define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
    #define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
    #define Max(a,b) ((a)<(b)?(b):(a))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define midd register int mid=(l+r)>>1
    #define TMP template < class ccf >
    
    TMP inline ccf qr(ccf b){
        char c=getchar();
        int q=1;
        ccf x=0;
        while(c<48||c>57)
    	q=c==45?-1:q,c=getchar();
        while(c>=48&&c<=57)
    	x=x*10+c-48,c=getchar();
        return q==-1?-x:x;
    }
    const int maxn=10005;
    const int maxm=100005;
    struct E{
        int to,nx;
    }e[maxm<<1];
    int head[maxn];
    int col[maxn];
    int cnt;
    int n,m;
    
    inline void add(int fr,int to,bool f){
        e[++cnt]=(E){to,head[fr]};
        head[fr]=cnt;
        if(f)
    	add(to,fr,0);
    }
    
    
    queue < int > q;
    inline int bfs(int S){
        q.push(S);
        col[S]=-1;
        int colcnt=0,tolcnt=0;
        while(!q.empty()){
    	register int now=q.front();
    	colcnt+=(col[now]==1);
    	tolcnt++;
    	q.pop();
    	ERP(t,now)
    	    if(col[e[t].to]!=0&&col[e[t].to]!=-col[now])
    		return -1;
    	    else
    		if(col[e[t].to]==0)
    		    q.push(e[t].to),col[e[t].to]=-col[now];
        }
        return Min(colcnt,tolcnt-colcnt);
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("in.in","r",stdin);
        freopen("out.out","w",stdout);
    #endif
        n=qr(1);
        m=qr(1);
        for(register int t=1,t1,t2;t<=m;++t){
    	t1=qr(1);
    	t2=qr(1);
    	add(t1,t2,1);
        }
        int ans=0,k;
        RP(t,1,n)
    	if(col[t]==0)
    	    if((k=bfs(t))==-1)
    		return puts("Impossible"),0;
    	    else
    		ans+=k;
        cout<<ans<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    DOCTYPE
    js——类型转换
    对象Object
    Array数组
    es6学习笔记
    springboot第一个项目【mybatis】
    springboot第一个项目【创建】
    项目管理和流程的拙见
    树莓派 Zero作为飞控图传
    一根数据线玩转树莓派Zero
  • 原文地址:https://www.cnblogs.com/winlere/p/10358136.html
Copyright © 2011-2022 走看看