【CCF 201709-4】通訊網路(Warshall 65分)
阿新 • • 發佈:2018-12-10
思路
用warshall演算法求傳遞閉包,之後遍歷鄰接矩陣計算有幾個部門能夠訪問到N個部門
O(n^3),顯然超時,但是程式碼量短,水一點分數還是很值的。
Warshall有兩個版本,其中第一個版本60分,第二個版本65分
#include <iostream> using namespace std; int n,m,a,b; bool adj[1001][1001]; int main() { cin>>n>>m; for(int i=1; i<=n; ++i) adj[i][i] = 1; while(m--) { cin>>a>>b; adj[a][b] = 1; } // 版本1: // for(int k=1; k<=n; ++k) // for(int i=1; i<=n; ++i) // for(int j=1; j<=n; ++j) // adj[i][j] = adj[i][j] | (adj[i][k] & adj[k][j]); // 版本2: for(int j=1; j<=n; j++) for(int i=1; i<=n; i++) { if(adj[i][j]) for(int k=1; k<=n; k++) adj[i][k] |= adj[j][k]; } int cnt = 0; bool flag = 1; for(int i=1; i<=n; ++i) { flag = 1; for(int j=1; j<=n; ++j) { if(!((adj[i][j] || adj[j][i]))) { flag = 0; break; } } if(flag) ++cnt; } cout<<cnt; return 0; }