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算法的主要内容,如果未能解决你的问题,请参考以下文章

CCF201709-4 通信网络(100分)DFS+BFS

CCF通信网络 简单搜索

最短路径算法——清晰简单的弗洛伊德算法(Floyd)

LeetCode 743 网络延迟时间[最短路径 迪杰斯特拉 Floyd] HERODING的LeetCode之路

floyd算法 青云的机房组网方案(简单)

(ccf)201709-4 通信网络