CCF(通信网络):简单DFS+floyd算法
Posted garrettwale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF(通信网络):简单DFS+floyd算法相关的知识,希望对你有一定的参考价值。
通信网络
201709-4
- 一看到题目分析了题意之后,我就想到用floyd算法来求解每一对顶点的最短路。如果一个点和任意一个点都有最短路(不为INF),那么这就是符合的一个答案。可是因为题目超时,只能拿60分。
- 另一种解法就是使用dfs把图简单的遍历一遍就可以了。这里要用到两遍dfs反着也要建图。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int INF=0X3F3F3F3F;
const int maxn=1003;
int n,m;
int map[maxn][maxn];
int map1[maxn][maxn];
bool vis[maxn];
bool vis1[maxn];
int main()
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
memset(map,INF,sizeof(map));
memset(map1,INF,sizeof(map1));
for(int i=0;i<m;i++)
int a,b;
cin>>a>>b;
map[a][b]=1;
map1[b][a]=1;
for(int i=1;i<=n;i++)
map[i][i]=0;
map1[i][i]=0;
vis[i]=true;
vis1[i]=true;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
map1[i][j]=min(map1[i][j],map1[i][k]+map1[k][j]);
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j]==INF&&map[j][i]==INF&&map1[i][j]==INF&&map1[j][i]==INF)
vis[i]=false;
break;
if(vis[i])
ans++;
//cout<<i<<endl;
cout<<ans<<endl;
//system("pause");
return 0;
以下是100分的使用dfs求解的算法代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
const int maxn=1003;
int n,m;
bool vis1[maxn];
bool vis2[maxn];
vector<int> v1[maxn];
vector<int> v2[maxn];
void dfs(int i)
for(int j=0;j<v1[i].size();j++)
if(!vis1[v1[i][j]])
vis1[v1[i][j]]=true;
dfs(v1[i][j]);
void dfsr(int i)
for(int j=0;j<v2[i].size();j++)
if(!vis2[v2[i][j]])
vis2[v2[i][j]]=true;
dfsr(v2[i][j]);
int main()
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=0;i<m;i++)
int a,b;
cin>>a>>b;
v1[a].push_back(b);
v2[b].push_back(a);
int ans=0;
for(int i=1;i<=n;i++)
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
vis1[i]=true;
dfs(i);
vis2[i]=true;
dfsr(i);
bool flag=true;
for(int j=1;j<=n;j++)
if(!vis1[j]&&!vis2[j])
flag=false;
break;
if(flag)
ans++;
cout<<ans<<endl;
//system("pause");
return 0;
以上是关于CCF(通信网络):简单DFS+floyd算法的主要内容,如果未能解决你的问题,请参考以下文章