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 }
總結
以上是生活随笔為你收集整理的Geodetic集合 c++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星GALAXY Note3拆机评测全面
- 下一篇: 小米M2手机的配置参数介绍