FOJ 2141(随机子图)

来源:互联网 发布:石器时代linux服务端 编辑:程序博客网 时间:2024/06/06 16:48

题意:给一个n个点,m条无向边,将图的点分成两部分,两部分之间的边数大于等于输出m/2。


解法:随机,居然可以过,不懂是不是正解;将图中的点不断地随机分成两部分直到满足要求,然后输出。


代码:

#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;int n,m;bool graph[110][110];bool points1[110];struct edge{    int u,v;} edges[10087];int main(){    //freopen("in.txt","r",stdin);   int t;scanf("%d",&t);   while(t--)   {       memset(graph,0,sizeof graph);       scanf("%d%d",&n,&m);       for(int i=0;i<m;i++){        scanf("%d%d",&edges[i].u,&edges[i].v);       }       while(1)       {        for(int i=1;i<=n;i++){           points1[i]=(rand())&1;        }        int ans=0;        for(int i=0;i<m;i++)            if(points1[edges[i].u]^points1[edges[i].v])            {                ans++;                if(ans>=m/2) break;            }        if(ans>=m/2)            break;       }       int p1=0,p2=0;       for(int i=1;i<=n;i++)        if(points1[i])p1++;        else p2++;       cout<<p1<<" ";       for(int i=1;i<=n;i++)         if(points1[i])cout<<i<<" ";cout<<'\n';       cout<<p2<<" ";       for(int i=1;i<=n;i++)        if(!points1[i])cout<<i<<" ";cout<<'\n';   }    return 0;}

0 0
原创粉丝点击