1. 程式人生 > >POJ-2570 Fiber Network---Floyd+二進制表示集合

POJ-2570 Fiber Network---Floyd+二進制表示集合

作用 建立 cas 思路 mat 行為 LG iostream name

題目鏈接:

https://vjudge.net/problem/POJ-2570

題目大意:

一些公司決定搭建一個更快的網絡,稱為“光纖網”。他們已經在全世界建立了許多站點,這 些站點的作用類似於路由器。不幸的是,這些公司在關於站點之間的接線問題上存在爭論,這樣“光纖網”項目就被迫終止了,留下的是每個公司自己在某些站點之間鋪設的線路。 現在,Internet 服務供應商,當想從站點 A傳送數據到站點 B,就感到困惑了,到底哪個公司 能夠提供必要的連接。請幫助供應商回答他們的查詢,查詢所有可以提供從站點 A到站定 B的線 路連接的公司。

輸入描述:

輸入文件包含多個測試數據。每個測試數據第 1行為一個整數 n,代表網絡中站點的個數,n = 0 代表輸入結束,否則 n的範圍為:1≤n≤200。站點的編號為 1, …, n。接下來列出了這些站 點之間的連接。每對連接占一行,首先是兩個整數 A和B,A = B = 0 代表連接列表結束,否則 A、 B的範圍為:1≤A, B≤n,表示站點 A和站點 B之間的單向連接;每行後面列出了擁有站點 A到 B之間連接的公司,公司用小寫字母標識,多個公司的集合為包含小寫字母的字符串。 連接列表之後,是供應商查詢的列表。每個查詢包含兩個整數 A和B,A = B = 0 代表查詢列 表結束,也代表整個測試數據結束,否則 A、B 的範圍為:1≤A, B≤n,代表查詢的起始和終止 站點。假定任何一對連接和查詢的兩個站點都不相同。

輸出描述:

對測試數據中的每個查詢,輸出一行,為滿足以下條件的所有公司的標識:這些公司可以通 過自己的線路為供應商提供從查詢的起始站點到終止站點的數據通路。如果沒有滿足條件的公司, 則僅輸出字符"-"。每個測試數據的輸出之後輸出一個空行。

思路:

公司最多有26個 可以用2進制來表示站點間的連接關系 如果提供站點 1 到站點 2 的連接的公司集合為{ ‘a‘, ‘b‘, ‘c‘ },可以用 “00000000000000000000000000000111”表示,提供站點 2到站點 3的連接的公司集合為{ ‘a‘, ‘d‘ },用“00000000000000000000000000001001”表示,這兩個整數進行二進制與運算後 得到“00000000000000000000000000000001”,表示通過中間站點 2,提供站點 1到站點 3的連 接的公司集合為{ ‘a‘ }。

這樣就floyd進行處理就類似最短路問題了

這裏主要是轉化成二進制處理集合的問題,然後就是模板的Floyd

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stack>
 8 #include<map>
 9 #include<set>
10 #include<sstream>
11
#define MEM(a, b) memset(a, b, sizeof(a)); 12 using namespace std; 13 typedef long long ll; 14 const int maxn = 200 + 10; 15 const int INF = 0x3f3f3f3f; 16 int T, n, m, cases, tot; 17 int Map[maxn][maxn]; 18 int main() 19 { 20 while(cin >> n && n) 21 { 22 MEM(Map, 0); 23 int x, y; 24 string s; 25 while(cin >> x >> y && (x + y)) 26 { 27 cin >> s; 28 for(int i = 0; i < s.size(); i++) 29 { 30 Map[x][y] |= (1<<(s[i] - a)); 31 } 32 } 33 for(int k = 1; k <= n; k++) 34 { 35 for(int i = 1; i <= n; i++) 36 { 37 for(int j = 1; j <= n; j++) 38 { 39 Map[i][j] |= Map[i][k] & Map[k][j]; 40 } 41 } 42 } 43 while(cin >> x >> y && (x + y)) 44 { 45 if(!Map[x][y])cout<<"-"<<endl; 46 else 47 { 48 for(int i = 0; i < 26; i++) 49 { 50 if(Map[x][y] & (1 << i)) 51 { 52 cout<<(char)(i + a); 53 } 54 } 55 cout<<endl; 56 } 57 } 58 cout<<endl; 59 } 60 return 0; 61 }

POJ-2570 Fiber Network---Floyd+二進制表示集合