CSP之通訊網路(60分\100分)
問題描述
試題編號: | 201709-4 |
試題名稱: | 通訊網路 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: |
問題描述 某國的軍隊由N個部門組成,為了提高安全性,部門之間建立了M條通路,每條通路只能單向傳遞資訊,即一條從部門a到部門b的通路只能由a向b傳遞資訊。資訊可以通過中轉的方式進行傳遞,即如果a能將資訊傳遞到b,b又能將資訊傳遞到c,則a能將資訊傳遞到c。一條資訊可能通過多次中轉最終到達目的地。 輸入格式 輸入的第一行包含兩個整數N, M,分別表示部門的數量和單向通路的數量。所有部門從1到N標號。 輸出格式 輸出一行,包含一個整數,表示答案。 樣例輸入 4 4 樣例輸出 2 樣例說明 部門1和部門4知道所有其他部門的存在。 評測用例規模與約定 對於30%的評測用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20; |
最初提交的程式碼只有60分,我仔細想了一下,主要原因還是在於每次搜尋過程都需要遍歷整個vector,以檢查是否存在重複元素,這也最終導致演算法的複雜度較高。後來我將向量G0換成陣列之後,成功解決了超時的問題,拿到了滿分。
下面分別是60分程式碼和滿分程式碼。
(60分)
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
#define MAX 1005
vector<int> G[MAX];
vector<int> G0[MAX];
//int G[MAX][MAX];
//int G0[MAX][MAX]
int vis[MAX];
int isok(int a,int b)
{
vector<int>::iterator iter;
iter=find(G0[a].begin(),G0[a].end(),b);
if(iter!=G0[a].end()) return 0;
else return 1;
}
void DFS(int s)
{
queue<int> q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
if(isok(s,u)) G0[s].push_back(u);
if(isok(u,s)) G0[u].push_back(s);
for(int j=0;j<G[u].size();j++)
{
int v=G[u][j];
if(vis[v]==0)
{
q.push(v);
vis[v]=1;
}
}
}
}
int main()
{
int N,M;
scanf("%d %d",&N,&M);
int i,j;
int a,b;
for(i=0;i<M;i++)
{
scanf("%d %d",&a,&b);
G[a].push_back(b);
}
for(i=1;i<=N;i++)
{
memset(vis,0,sizeof(vis));
DFS(i);
}
int ans=0;
for(i=1;i<=N;i++)
{
if(G0[i].size()==N)
{
ans++;
}
}
printf("%d\n",ans);
return 0;
}
(100分)
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
#define MAX 1005
vector<int> G[MAX];
int adj[MAX][MAX];
int vis[MAX];
//int isok(int a,int b)
//{
// vector<int>::iterator iter;
// iter=find(G0[a].begin(),G0[a].end(),b);
// if(iter!=G0[a].end()) return 0;
// else return 1;
//
//}
void DFS(int s)
{
queue<int> q;
q.push(s);
vis[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
adj[s][u]=adj[u][s]=1;
for(int j=0;j<G[u].size();j++)
{
int v=G[u][j];
if(vis[v]==0)
{
q.push(v);
vis[v]=1;
}
}
}
}
int main()
{
int N,M;
scanf("%d %d",&N,&M);
int i,j;
int a,b;
memset(adj,0,sizeof(adj));
for(i=0;i<M;i++)
{
scanf("%d %d",&a,&b);
G[a].push_back(b);
}
for(i=1;i<=N;i++)
{
memset(vis,0,sizeof(vis));
if(vis[i]==0) DFS(i);
}
int ans=0;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(adj[i][j]==1&&adj[j][i]==1) continue;
else break;
}
if(j==N+1) ans++;
}
printf("%d\n",ans);
return 0;
}
相關文章
- 網路通訊
- ET框架6.0分析三、網路通訊框架
- 【Zookeeper】原始碼分析之網路通訊(一)原始碼
- udp網路通訊UDP
- 網路通訊2:TCP通訊實現TCP
- 網路通訊3:TCP互動通訊TCP
- 網路通訊2:TCP簡單通訊TCP
- Node.js之網路通訊模組淺析Node.js
- 【Zookeeper】原始碼分析之網路通訊(三)之NettyServerCnxn原始碼NettyServer
- 【Zookeeper】原始碼分析之網路通訊(二)之NIOServerCnxn原始碼iOSServer
- Android與物聯網裝置通訊-網路模型分層Android模型
- dubbo網路通訊(四)
- 網路通訊1:UDPUDP
- 19作 網路通訊
- 網路通訊協議協議
- 網路通訊基礎
- 網際網路通訊安全之終端資料保護
- 深入淺出Kubernetes網路:跨節點網路通訊之Flannel
- docker系列(五):網路通訊Docker
- 網路通訊程式設計程式設計
- BZOJ3651 : 網路通訊
- Java網路通訊套接字Java
- Calico 網路通訊原理揭祕
- WebRTC---網路實時通訊Web
- 網路通訊4:TCP廣播TCP
- 網路通訊技術基礎
- SocketServer ——網路通訊伺服器Server伺服器
- 快速理解網路通訊協議協議
- 網路通訊單元NU系列
- 網路-淺談批次通訊和自主通訊的區別
- 網路通訊協議自動轉換之thrift到http協議HTTP
- C#使用命名管道通過網路在程式之間進行通訊C#
- 一個簡單混合協議通訊列子,物聯網和網際網路通訊。協議
- 網路通訊5:HTTP下載器HTTP
- 網路和通訊安全有哪些要求?
- ES系列(三):網路通訊模組解析
- 使用UDP如何進行網路通訊UDP
- 在網路通訊中應用Protobuf