zoukankan      html  css  js  c++  java
  • 【杭电】[5631]Rikka with Graph

    Rikka with Graph

    Time Limit: 2000/1000 MS (Java/Others)

    Memory Limit: 65536/65536 K (Java/Others)

    Problem Description

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them: Yuta has a non-direct graph with n vertices and n+1 edges. Rikka can choose some of the edges (at least one) and delete them from the graph. Yuta wants to know the number of the ways to choose the edges in order to make the remaining graph connected. It is too difficult for Rikka. Can you help her?

    Input

    The first line contains a number T(T30)——The number of the testcases. For each testcase, the first line contains a number n(n100). Then n+1 lines follow. Each line contains two numbers u,v , which means there is an edge between u and v.

    Output

    For each testcase, print a single number.

    Sample Input

    1
    3
    1 2
    2 3
    3 1
    1 3

    Sample Output

    9

    给了n点,n+1条边,问存在多少个方案使图去掉几条边后,仍能连通。
    由连通图性质知,n个点至少要有n-1条边才能连通
    因为数据范围较小
    所以尝试采取枚举法看去掉某一条或某两条边后图是否连通
    判断图是否连通可用并查集

    #include<stdio.h>
    int par[120];
    struct node {
        int n,m;
    } a[120];
    int find(int m) {
        if(m==par[m])
            return m;
        else
            return par[m]=find(par[m]);
    }
    void unite(int x,int y) {
        x=find(x);
        y=find(y);
        if(x==y)
            return ;
        else
            par[y]=x;
    }
    int main() {
        int T;
        scanf("%d",&T);
        while(T--) {
            int n;
            scanf("%d",&n);
            for(int i=0; i<n+1; i++) {
                scanf("%d %d",&a[i].n,&a[i].m);
            }
            int res=0;
            for(int i=0; i<n+1; i++) {
                for(int j=i; j<n+1; j++) {
                    for(int k=1; k<=n; k++)
                        par[k]=k;
                    for(int k=0; k<n+1; k++) {
                        if(k==i||k==j)
                            continue;
                        unite(a[k].n,a[k].m);
                    }
                    int k;
                    for(k=1; k<n; k++) {
                        if(find(n)!=find(k))
                            break;
                    }
                    if(k==n)
                        res++;
                }
            }
            printf("%d
    ",res);
        }
        return 0;
    }



    查看原文:http://www.boiltask.com/blog/?p=1965
  • 相关阅读:
    腾讯分析系统架构解析
    GreenPlum简单性能测试与分析--续
    我的一些提高效率的设置
    Windows 上借助注册表来修改键盘按键的映射
    WPF入门——Converter、XAML和Style
    30个极大提高开发效率的Visual Studio Code插件(转)
    USB PD充电
    macOS Mojave 美化一下终端
    WPF入门(4)——资源
    使用Duilib开发Windows软件(5)——使用VLC做视频播放
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569451.html
Copyright © 2011-2022 走看看