zoukankan      html  css  js  c++  java
  • UVA 10985 Rings'n'Ropes

    UVA_10985

    LR的间距能拉多远是取决于LR之间的最短路,因此,水平悬挂的绳一定是LR之间最短路的一个部分。

    而水平的Ring一定满足到LR的距离和是LR之间最短路的长度,因此我们可以先把所有水平的Ring找出来,符合要求的线一定是这些水平Ring之间的连线,但水平Ring之间的连线不一定符合要求(当两个Ring位于同一位置且恰好两者之间有一条连线,这条连线就不符合要求)。

    因此,思路就是先用Floyd做最短路,然后枚举LR并计算符合要求的连线的数目即可。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 150
    #define INF 100000000
    int f[MAXD][MAXD], M, N, res, ans[MAXD];
    void init()
    {
    int i, j, a, b;
    scanf("%d%d", &N, &M);
    for(i = 0; i < N; i ++)
    for(j = 0; j < N; j ++)
    {
    if(i == j)
    f[i][j] = 0;
    else
    f[i][j] = INF;
    }
    for(i = 0; i < M; i ++)
    {
    scanf("%d%d", &a, &b);
    f[a][b] = f[b][a] = 1;
    }
    }
    void floyd()
    {
    int i, j, k;
    for(k = 0; k < N; k ++)
    for(i = 0; i < N; i ++)
    for(j = 0; j < N; j ++)
    if(f[i][k] + f[k][j] < f[i][j])
    f[i][j] = f[i][k] + f[k][j];
    }
    void printresult()
    {
    int i, j, k, max = 0;
    for(i = 0; i < N; i ++)
    for(j = i + 1; j < N; j ++)
    if(f[i][j] != INF)
    {
    res = 0;
    for(k = 0; k < N; k ++)
    if(f[i][k] + f[k][j] == f[i][j])
    ans[res ++] = k;
    int p, q, temp = 0;
    for(p = 0; p < res; p ++)
    for(q = p + 1; q < res; q ++)
    {
    int a = ans[p];
    int b = ans[q];
    if(f[a][b] == 1 && f[i][a] != f[i][b])
    temp ++;
    }
    if(temp > max)
    max = temp;
    }
    printf("%d\n", max);
    }
    int main()
    {
    int t, tt;
    scanf("%d", &t);
    for(tt = 0; tt < t; tt ++)
    {
    init();
    floyd();
    printf("Case #%d: ", tt + 1);
    printresult();
    }
    return 0;
    }


  • 相关阅读:
    实例:如何设计一款好的Metro UI应用
    给用户和开发者最佳的.Net框架部署方案
    软件测试对嵌入式系统的影响
    如何创造出优秀的用户体验?
    Xamarin:使用C#移植Android操作系统
    WCF数据服务5.0 RTM发布
    演进式数据库建模
    zsh 命令行编辑技巧三则
    Oracle与MySQL的几点区别
    window下mysql表的修复
  • 原文地址:https://www.cnblogs.com/staginner/p/2214525.html
Copyright © 2011-2022 走看看