UVALive 6603 Seven Segment Display

题目地址

图中所有点的度为1,2,3。先判断图是否联通,然后看度为1,3的点有几个,再看度为3的点之间夹了多少其他点。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long

int v[10]={6,3,6,6,5,6,6,4,6,6};
int e[10]={6,2,5,5,4,5,6,3,7,6};

int d[55];
int c[2222];
int n,m;
int degree[55];
int gao(int i)
{
    if((n-v[i])%e[i]==0&&m%e[i]==0) {
        int a=(n-v[i])/e[i],b=m/e[i]-1;
        degree[i]=a==b?a:-1;
    }
    else degree[i]=-1;
}
#include<vector>
vector<int> g[1111];
int fa[2222];
bool j1()
{
    int t=0;
    for(int i=1;i<=n;i++)
    {
        if(fa[i]==i) t++;
        if(t>1) return 0;
    }
    return 1;
}
int f(int x) { return x==fa[x]?x:fa[x]=f(fa[x]); }
bool vis[3333];
int dfs(int u)
{
    int ret=1;
    vis[u]=1;
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i];
        if(!vis[v]) ret+=dfs(v);
    }
    return ret;
}
vector<int> solve()
{
    memset(vis,0,sizeof vis);
    vector<int> ret;
    int st=-1;
    for(int i=1;i<=n;i++)
    {
        if(c[i]==3) vis[i]=1;
        if(c[i]==1) st=i;
    }
    if(st>-1) ret.push_back(dfs(st));
    for(int i=1;i<=n;i++)
        if(!vis[i]) ret.push_back(dfs(i));
    sort(ret.begin(),ret.end());
    return ret;
}
void init()
{
    memset(degree,-1,sizeof degree);
    for(int i=1;i<=n;i++)g[i].clear();
    memset(d,0,sizeof d);
    memset(c,0,sizeof c);
    for(int i=1;i<=n;i++) fa[i]=i;
}
int main()
{
    int re; cin>>re; int ca=1;
    while(re--)
    {
        cin>>n>>m;
        init();
        for(int i=0;i<m;i++) {
            int u,v;
            scanf("%d%d",&u,&v);
            fa[f(u)]=f(v);
            g[u].push_back(v);
            g[v].push_back(u);
            c[u]++ , c[v]++;
        }
        printf("Case %d: ",ca++);
        bool ok=1;
        for(int i=1;i<=n;i++) {
            d[c[i]]++;
            if(c[i]==0||c[i]>3)
            {
                ok=0;
                break;
            }
        }
        if(!j1())ok=0;
        if(ok==0)
        {
            printf("0\n");
            if(re) putchar(10);
            continue;
        }
        if(d[1]==2&&d[3]==0)
        {
            gao(1);
            gao(2);
            gao(5);
            gao(7);
        }
        if(d[1]==0&&d[3]==0)
        {
            gao(0);
        }
        if(d[1]==3&&d[3]==1)
        {
            vector<int> ret=solve();
            if(ret.size()==3)
            {
                sort(ret.begin(),ret.end());
                if(ret[1]==2*ret[0]&&ret[2]==2*ret[0])
                    gao(3);
                if(ret[2]==2*ret[1]&&ret[2]==2*ret[0])
                    gao(4);
            }
        }
        if(d[1]==1&&d[3]==1)
        {
            vector<int> ret=solve();
            if(ret.size()==2&&ret[0]*2==ret[1]+1&&ret[0]%2==0)
                gao(6),gao(9);
        }
        if(d[1]==0&&d[3]==2)
        {
            vector<int> ret=solve();
            if(ret.size()==2) ret.push_back(0);
            sort(ret.begin(),ret.end());
            if(ret.size()==3)
            {
                if(ret[1]==ret[2]&&ret[1]-2==3*ret[0])
                    gao(8);
            }
        }
        int ans=0;
        for(int i=0;i<=9;i++)
            if(degree[i]!=-1)
            ans++;
        printf("%d\n",ans);
        for(int i=0;i<=9;i++)
        {
            if(degree[i]>-1)
                printf("%d %d\n",i,degree[i]);
        }
        if(re) printf("\n");
    }
}


你可能感兴趣的:(UVALive 6603 Seven Segment Display)