Tarjan双联通缩点后,建树,任选一点为根节点求出所有点的字节点的个数+1:m
然后求出n-m与m的差值,求出最小的
#include#include #include #define inf 0x3fffffff #define N 10001 using namespace std; int belong[N],dfs[N],low[N],idx,ans,head[N],num,n,m,people[N],pe[N],nume,sum,vis[N]; struct edge { int st,ed,next; }E[N*4],e[N*4]; void addedge(int x,int y) { E[num].st=x; E[num].ed=y; E[num].next=head[x]; head[x]=num++; } void Addedge(int x,int y) { e[nume].st=x; e[nume].ed=y; e[nume].next=head[x]; head[x]=nume++; } stack Q; void Tarjan(int u,int father) { int i,j,v,flag=0; low[u]=dfs[u]=idx++; Q.push(u); for(i=head[u];i!=-1;i=E[i].next) { v=E[i].ed; if(dfs[v]==-1) { Tarjan(v,u); low[u]=low[u]>low[v] low[v]:low[u]; } else if(v==father) { if(flag) low[u]=low[u]>dfs[v] dfs[v]:low[u]; flag++; } else low[u]=low[u]>dfs[v] dfs[v]:low[u]; } if(dfs[u]==low[u]) { do { j=Q.top(); Q.pop(); belong[j]=ans; people[ans]+=pe[j]; }while(j!=u); ans++; } } void buildmap() { memset(head,-1,sizeof(head)); nume=0; for(int i=0;i temp) mn=temp; } return cont; } int main() { int i,x,y; while(scanf("%d%d",&n,&m)!=-1) { sum=0; memset(head,-1,sizeof(head)); num=0; for(i=0;i