• Geodetic集合 c++


    感谢某位不知名dalao的博客,我才知道怎么解题....

    最开始连题意都读错了....这个故事告诉我们要好好读题

    描述 Description
    图G是一个无向连通图,没有自环,并且两点之间至多只有一条边。我们定义顶点v,u最短路径就是从v到u经过边最少的路径。所有包含在v-u的最短路径上的顶点被称为v-u的Geodetic顶点,这些顶点的集合记作I(v, u)。
    我们称集合I(v, u)为一个Geodetic集合。
    例如下图中,I(2, 5)={2, 3, 4, 5},I(1, 5)={1, 3, 5},I(2, 4)={2, 4}。

     给定一个图G和若干点对v,u,请你分别求出I(v, u)。

    输入格式 Input Format
    第一行两个整数n,m,分别表示图G的顶点数和边数(顶点编号1-n)
      下接m行,每行两个整数a,b表示顶点a和b之间有一条无向边。
      第m+2行有一个整数k,表示给定的点对数。
      下接k行,每行两个整数v,u。

    输出格式 Output Format
      共k行,每行对应输入文件中每一个点对v,u,按顶点编号升序输出I(v, u)。同一行的每个数之间用空格分隔。

    样例输入 Sample Input
    5 6
    1 2
    1 3
    2 3
    2 4
    3 5
    4 5
    3
    2 5
    5 1
    2 4

     样例输出 Sample Output

    2 3 4 5
    1 3 5
    2 4

     思路挺简单,floyed一遍算出最短路径

    然后再循环判断并记录集合内的点即可,然而实现看起来挺鬼畜!?感谢数据量不大吧.....

     1 #include<bits/stdc++.h>
     2 #define maxn 100
     3 using namespace std;
     4 struct node{
     5   int x,y;
     6 }a[10086];
     7 int n,m,kk;
     8 int fu[maxn][maxn],s[maxn][maxn];
     9 int dis[maxn][maxn][maxn];
    10 int main(){
    11   cin>>n>>m;
    12   memset(fu,10,sizeof(fu));
    13   for(int i=1;i<=n;i++)
    14     fu[i][i]=0;
    15   for(int i=1;i<=m;i++){
    16     int xx,yy;
    17     cin>>xx>>yy;
    18     fu[xx][yy]=1;fu[yy][xx]=1;
    19   }
    20   cin>>kk;
    21   for(int i=1;i<=kk;i++){
    22     cin>>a[i].x>>a[i].y;
    23   }
    24   for(int k=1;k<=n;k++)
    25     for(int i=1;i<=n;i++)
    26       for(int j=1;j<=n;j++)
    27         if(fu[i][k]+fu[k][j]<fu[i][j])//floyed求最短路 
    28           fu[i][j]=fu[i][k]+fu[k][j];
    29   for(int k=1;k<=n;k++)
    30     for(int i=1;i<=n;i++)
    31       for(int j=1;j<=n;j++)
    32         if(fu[i][k]+fu[k][j]==fu[i][j])//因为已经完成松弛,所以如果得出如此条件判断,说明是最短路径 
    33           dis[i][j][++s[i][j]]=k;//i,j固定位置,数组s[i][j]记录经过点的个数,dis数组存储顶点 
    34   for(int i=1;i<=kk;i++){
    35     for(int j=1;j<=s[a[i].x][a[i].y];j++)//枚举集合内的点的个数 
    36       cout<<dis[a[i].x][a[i].y][j]<<' ';
    37     cout<<endl;
    38   }    
    39   return 0;
    40 }
  • 相关阅读:
    Ubuntu更改主目录文件名为英文
    Ubuntu下搜狗输入法无法输入中文
    Linux终端快捷键
    【Java】 大话数据结构(4) 线性表之循环链表
    【Java】 大话数据结构(3) 线性表之静态链表
    【Java】java.lang.NullPointerException的两个原因
    【Java】 大话数据结构(2) 线性表之单链表
    【Java】 Scanner类的几个方法
    【Java】 大话数据结构(1) 线性表之顺序存储结构
    【Java】 参数的传递:值传递与引用传递讨论
  • 原文地址:https://www.cnblogs.com/ywjblog/p/8462684.html
Copyright © 2020-2023  润新知