日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Geodetic集合 c++

發(fā)布時間:2024/8/5 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 Geodetic集合 c++ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

最開始連題意都讀錯了....這個故事告訴我們要好好讀題

描述 Description
圖G是一個無向連通圖,沒有自環(huán),并且兩點之間至多只有一條邊。我們定義頂點v,u最短路徑就是從v到u經(jīng)過邊最少的路徑。所有包含在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
第一行兩個整數(shù)n,m,分別表示圖G的頂點數(shù)和邊數(shù)(頂點編號1-n)
  下接m行,每行兩個整數(shù)a,b表示頂點a和b之間有一條無向邊。
  第m+2行有一個整數(shù)k,表示給定的點對數(shù)。
  下接k行,每行兩個整數(shù)v,u。

輸出格式 Output Format
  共k行,每行對應輸入文件中每一個點對v,u,按頂點編號升序輸出I(v, u)。同一行的每個數(shù)之間用空格分隔。

樣例輸入 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一遍算出最短路徑

然后再循環(huán)判斷并記錄集合內(nèi)的點即可,然而實現(xiàn)看起來挺鬼畜!?感謝數(shù)據(jù)量不大吧.....

 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])//因為已經(jīng)完成松弛,所以如果得出如此條件判斷,說明是最短路徑 
33           dis[i][j][++s[i][j]]=k;//i,j固定位置,數(shù)組s[i][j]記錄經(jīng)過點的個數(shù),dis數(shù)組存儲頂點 
34   for(int i=1;i<=kk;i++){
35     for(int j=1;j<=s[a[i].x][a[i].y];j++)//枚舉集合內(nèi)的點的個數(shù) 
36       cout<<dis[a[i].x][a[i].y][j]<<' ';
37     cout<<endl;
38   }    
39   return 0;
40 }

總結

以上是生活随笔為你收集整理的Geodetic集合 c++的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。