• 洛谷p1330,封锁阳光大学


    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int num_edge=0,head[10001],sum,n,m,u,v,d,mark[10001],sum1=1,sum2=0;
    bool markt=0;
    struct Edge
    {
     int next,to,dis;
    }edge[200001];
    void add_edge(int from,int to)
    {
     edge[++num_edge].next=head[from];
     edge[num_edge].to=to;
     head[from]=num_edge;
    }
    void dfs(int tt,int mi)

     for(int i=head[tt];i!=0;i=edge[i].next)
      { if(markt==1) return;
       if(mark[edge[i].to]==0)
       {
        mark[edge[i].to]=mi;
        if(mi==1) {//printf("%d  %d>> ",mark[edge[i].to],edge[i].to);
        sum1++;
        }
        else
        {//printf("%d  %d<< ",mark[edge[i].to],edge[i].to);
        sum2++;
        }
        dfs(edge[i].to,-mark[edge[i].to]);
       }
       else if(mark[edge[i].to]!=mi)
       {
        printf("Impossible");markt=1;return;
       }
      }
    }
    int min(int a,int b)

     return a>b?b:a;
    }
    int  main()
    { cin>>n>>m;
     for(int i=1;i<=m;i++)
      {
       cin>>u>>v;
       add_edge(u,v);
       add_edge(v,u);
      }
     for(int i=1;i<=n;i++)
     { if(mark[i]==0)
      {mark[i]=1;
      dfs(i,-mark[i]);
      }
      sum+=min(sum1,sum2);
      sum1=1;sum2=0;
      if(markt==1) return 0;
     }
     //for(int i=1;i<=n;i++)
     // printf("%d>>%d  ",i,mark[i]);
     if(markt==0) printf("%d",sum);
     return 0;
     }

    一个比较基础的图的遍历的模板题,深度优先搜索遍历。

    黑白染色法,解决相邻点不同。

    ***注意:无向图储存边的条数是题目要求的两倍。。

  • 相关阅读:
    ihaiLjEUSx
    表达式的逆波兰式转化模板
    运算表达式求值模板
    程序员花式拜年脚本
    vbs脚本实现自动打字祝福&搞笑
    MFC实现红黑砖块
    vbs脚本实现qq定时发消息(初级)
    打包java程序生成exe
    webpack配置
    vue路由
  • 原文地址:https://www.cnblogs.com/xcsj/p/11937814.html
Copyright © 2020-2023  润新知