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;
}
posted @ 2019-09-03 20:26  Garrett_Wale  阅读(360)  评论(0编辑  收藏  举报