zoukankan      html  css  js  c++  java
  • UVA 10985

    Problem D
    Rings'n'Ropes
    Time Limit: 3 seconds

     

     

    "Well, that seems to be the situation. But,
    I don't want that, and you don't want that,
    and Ringo here definitely doesn't want that."

    Jules Winnfield

    I have n tiny rings made of steel. I also have m pieces of rope, all of exactly the same length. The two ends of each piece of rope are tied to two different rings.

    I am going to take one of the rings, L, into my left hand, and another ring, R into my right hand. Then I will pull the whole structure apart as hard as I can. Some of the ropes will be streched horizontally because of this. Others will hang down or bend out of shape. If I want the number of horizontally stretched ropes to be as large as possible, which L and R should I pick?

    Assume that the stretching of ropes in negligible, they all have negligible thickness and are free to slide around the rings that they are tied to. The thickness and radius of each ring is negligible, too.

    Input
    The first line of input gives the number of cases, NN test cases follow. Each one starts with two lines containing n ( 2<= n<=120 ) and m( 0<= m<= n( n-1)/2 ). The next m lines will each contain a pair of different rings (integers in the range [0, n-1]). Each pair of rings will be connected by at most one rope.

    Output
    For each test case, output the line containing "Case #x:", followed by the largest number of ropes that I can stretch horizontally by picking a pair of rings, L and R.

    Sample Input Sample Output
    4
    2 
    1
    0 1
    3
    3
    0 1
    1 2
    2 0
    6
    6
    0 1
    0 5
    1 3
    5 4
    3 2
    4 2
    6
    7
    0 1
    0 5
    1 3
    1 4
    5 4
    3 2
    4 2
    
    Case #1: 1
    Case #2: 1
    Case #3: 6
    Case #4: 7
    

     

    题意:有n个戒指,中间连着m条绳子,现在要求出选定两个戒指,拉直之后,中间有多少绳子被绷直,求出绷直绳子最多的绳子数

    思路:最短路,先用floyd打出整个最短路表,然后枚举两点,把两点间满足最短路的所有点都找出来,然后还要进行一个判断,如果起点到两个点的距离是相等的话,那么这条边是无法被拉直的。

    代码:

    #include <stdio.h>
    #include <string.h>
    #define INF 0x3f3f3f3f
    const int N = 155;
    
    int T, n, m, cas = 0;
    int a, b;
    int g[N][N], f[N][N];
    
    void init() {
        memset(g, 0, sizeof(g));
        memset(f, INF, sizeof(f));
        scanf("%d%d", &n, &m);
        for (int i = 0; i < m; i ++) {
    	scanf("%d%d", &a, &b);
    	f[a][b] = f[b][a] = 1;
    	g[a][b] = g[b][a] = 1;
        }
        for (int i = 0; i < n; i ++)
    	f[i][i] = 0;
        for (int k = 0; k < n; k ++)
    	for (int i = 0; i < n; i ++)
    	    for (int j = 0; j < n; j ++) {
    		if (f[i][j] > f[i][k] + f[k][j])
    		    f[i][j] = f[i][k] + f[k][j];
    	    }
    }
    
    void solve() {
        init();
        int ans = 0;
        for (int u = 0; u < n; u ++)
    	for (int v = u + 1; v < n; v ++) {
    	    int save[N], num = 0, count = 0;
    	    for (int i = 0; i < n; i ++) {
    		if (f[u][v] == f[u][i] + f[i][v])
    		    save[num ++] = i;
    	    }
    	    for (int i = 0; i < num; i ++)
    		for (int j = i + 1; j < num; j ++) {
    		    if (g[save[i]][save[j]] && f[u][save[i]] != f[u][save[j]])
    			count ++;
    		}
    	    if (count > ans)
    		ans = count;
    	}
        printf("Case #%d: %d
    ", ++cas, ans);
    }
    
    int main() {
        scanf("%d", &T);
        while (T --) {
    	solve();	
        }
        return 0;
    }


  • 相关阅读:
    RS交叉表按照预定的节点成员排序
    Open DJ备份与恢复方案
    SQLServer2008备份时发生无法打开备份设备
    数据仓库备份思路
    SQLServer代理新建或者编辑作业报错
    Transfrom在64bit服务下面无法运行
    ActiveReport开发入门-图表的交互性
    ActiveReport开发入门-列表的交互性
    /etc/fstab 参数详解(转)
    CentOS7 查看硬盘情况
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3455282.html
Copyright © 2011-2022 走看看