洛谷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>>\n",mark[edge[i].to],edge[i].to);
    sum1++;
    }
    else
    {//printf("%d  %d<<\n",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;
 }

 

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

 

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

 

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

posted @ 2019-11-26 19:16  Xcsj  阅读(111)  评论(0编辑  收藏  举报