HDU 5277 YJC counts stars 最大团+暴力

来源:互联网 发布:淘宝联盟 不能退款 编辑:程序博客网 时间:2024/05/17 04:24
HDU 5277
题意:平面上n个点(x,y).连接m条线段.任意两条线段不相交.
找到sz最大的集合满足 集合内的两个两个点都有线段直接相连.和最大sz和最大sz的集合个数? n,m<=1e3.


最大团:通俗点讲就是在一个无向图中找出一个点数最多的完全图。
因为任意线段不相交 所以最大团的sz最大为4.

判定sz是否为4,枚举两条边 两条边(a,b),(c,d)定点都不同 在判定是否有边(a,c),(a,d) (b,c),(b,d)即可.
判定sz是否为3.枚举一条边和一个点即可.

sz=2个数为边数.sz个数为定点数.

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+20;struct node{    int x,y;    node(int _x,int _y):x(_x),y(_y)    {    }};vector<node> v;int n,m,x,y;bool g[N][N];int main(){    while(cin>>n>>m)    {        v.clear();        memset(g,0,sizeof(g));        for(int i=1;i<=n;i++)            scanf("%d%d",&x,&y);        for(int i=1;i<=m;i++)        {            scanf("%d%d",&x,&y);            g[x][y]=g[y][x]=true;            v.push_back(node(x,y));        }        int ans[5]={0};        for(int i=0;i<v.size();i++)            for(int j=i+1;j<v.size();j++)            {                node x=v[i],y=v[j];                int a=x.x,b=x.y,c=y.x,d=y.y;                if(a!=c&&a!=d&&b!=c&&b!=d)                {                    if(g[a][c]&&g[a][d]&&g[b][c]&&g[b][d])                        ans[4]++;                }            }        if(ans[4]>0)        {            printf("4 %d\n",ans[4]/3);            continue;        }        for(int i=0;i<v.size();i++)        {            for(int j=1;j<=n;j++)            {                node x=v[i];                int a=x.x,b=x.y;                if(j!=a&&j!=b&&g[a][j]&&g[b][j])                    ans[3]++;            }        }        if(ans[3]>0)            printf("3 %d\n",ans[3]/3);        else if(m>0)            printf("2 %d\n",m);        else            printf("1 %d\n",n);    }    return 0;}