UVA 10985 - Rings'n'Ropes(floyd)

原创 2013年12月02日 20:42:30

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\n", ++cas, ans);
}

int main() {
    scanf("%d", &T);
    while (T --) {
	solve();	
    }
    return 0;
}


暴力,STL,哈希技术,Floyd判圈算法(计算器谜题,uva 11549)

想了老半天,只会暴力,然后就过了。。 实现由三种方法,一是STL,而是哈希技术,三是Floyd判圈法。 就速度而言,Floyd判圈法>哈希技术>STL。分别跑了70ms,180ms,480...
  • xl2015190026
  • xl2015190026
  • 2016年10月25日 00:26
  • 1945

uva 10985(最短路径)

题意: 题解:
  • u013392752
  • u013392752
  • 2014年11月20日 21:57
  • 634

买还是建buy or build,uva1151——最小生成树,Kruskal,枚举子集

平面上有n个点(1 kruskal: 先求一次原图的最小生成树,得到n-1条边,然后每次枚举完套餐后只考虑套餐中的边和这n-1条边,则枚举套餐之后再求最小生成树。 精髓:kruskal算法...
  • u014141559
  • u014141559
  • 2015年01月21日 20:22
  • 533

hihoCoder 1089 : 最短路径·二:Floyd算法(水题,练手)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋!鬼屋中一共有N个地点,分别编号为1..N,这N个地点之...
  • qq_32866009
  • qq_32866009
  • 2016年07月03日 10:34
  • 598

UVa 201 Squares(正方形)

题意: 有n行n列(2 行从上到下编号为1~n,列从左到右编号为1~n。边用H i j和V i j表示,分别代表(i,j)-(i,j+1)和(i,j)-(i+1,j)。 思路: 读入的时候,先对每...
  • Ramay7
  • Ramay7
  • 2015年12月20日 08:51
  • 531

UVA10010(八方向暴力枚举)

Where's Waldorf? Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 题目链接:http:/...
  • u013447865
  • u013447865
  • 2014年11月26日 12:18
  • 486

hdu 4635 Strongly connected 【图论-强连通分量-缩点-完全图】

Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav...
  • xingdragon
  • xingdragon
  • 2017年04月13日 18:19
  • 313

Floyd算法分析和实现

其实我觉得这个算法还是很简单的,但是看网上的资料感觉很高深,说的我稀里糊涂的。难道是我想错啦?希望大神帮我指正(真心没自信)。。谢谢。 /* Floyd算法:可以解决任何两点间的最短距离问题。而d...
  • keep_moving_cqu
  • keep_moving_cqu
  • 2013年11月03日 01:16
  • 1423

Floyd算法——C++实现版

// Floyd.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #define MAX_VALUE 1000 #de...
  • u012102306
  • u012102306
  • 2015年11月16日 16:40
  • 1838

Floyd算法的C&python实现及对比

本次我要给大家带来的是Floyd算法,分别用C语言和python实现,并回溯出完整路径。支持无向赋权图、有向赋权图,不支持权为负数的情况。...
  • zhouweilin56091
  • zhouweilin56091
  • 2015年08月26日 00:21
  • 1277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 10985 - Rings'n'Ropes(floyd)
举报原因:
原因补充:

(最多只允许输入30个字)