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;
}

原文地址:https://www.cnblogs.com/GarrettWale/p/11455388.html

时间: 2024-11-04 00:20:29

CCF(通信网络):简单DFS+floyd算法的相关文章

【CCF】通信网络 简单搜索

去重!不然有环就直接挂掉了...0分 #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef long long ll; const int maxn=1e3+2; const

CODE [VS] 1009 产生数 (用Floyd算法求解传递闭包)

题目链接:http://codevs.cn/problem/1009/ 问题分析:很明显,扫描一遍字符串,遇到可以变换的数字,将这个可以变换的数字的所有可能情况的数目乘起来便是我们要的答案.现在的问题便是如何求解单个数字的所有可能情况.而这可以通过求解数字 0-9 之间的邻接矩阵的传递闭包的方法求解出来.用floyd算法即可. ps:有人会问,floyd算法为何可以求解传递闭包?理由很简单,floyd算法可以求解出邻接矩阵中任意两个点之间的最短距离,让一个邻接矩阵跑完floyd算法之后,再扫描一

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

青云的机房组网方案(简单) 青云现在要将 nn 个机房连成一个互相连通的网络.工程师小王设计出一个方案:通过在 nn 个机房之间铺设 n-1n−1 条双向的光纤,将所有的机房连接.可以假设数据在两个机房之间的光纤传输需要 11 单位时间.每个机房 ii 有一个初始值 a_ia?i??,当两个机房的初始值之间互质时,我们认为这两个机房之间的传输性能是非常重要的.请帮小王计算出所有数值互质的机房对之间的传输时间之和. 输入格式 第一行输入一个正整数 nn,第二行输入 nn 个正整数 a_1...a_

ccf认证 201709-4 通信网络 java实现

试题编号:                                                               201709-4 试题名称: 通信网络 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息.信息可以通过中转的方式进行传递,即如果a能将信息传递到b,b又能将信息传递到c,则a能将信息传递到c.一条信息

“Chaos”的算法之Floyd算法

倘若我们要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络.其实现最基本的功能,求出任意两点间的最短路径, 求最短路径的经典方法有很多种,最常用的便是迪杰斯特拉算法和佛洛依德(Floyd)算法,这篇文章就着重介绍Floyd算法. 求两点之间的最短路径无外乎有两种情况,一种就是从一点直接到另一点,另一种就是从一点经过n个节点后再到另一个节点,比如说要从A到B,则有两种情况就是A直接到B,或者是从A经过N个节点后再到B,所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离

最短路问题(floyd算法)(优化待续)

问题描述: 最短路问题(short-path problem):若网络中的每条边都有一个数值(长度.成本.时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题.最短路问题是网络理论解决的典型问题之一,可用来解决管路铺设.线路安装.厂区布局和设备更新等实际问题. 1.floyd算法 算法描述: Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名.

图论(floyd算法):NOI2007 社交网络

[NOI2007] 社交网络 ★★   输入文件:network1.in   输出文件:network1.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系.我 们将这个关系网络对应到一个n个结点的无向图上,两个不同的人若互相认识,则在他们对应的结点之间连接一条无向边,并附上一个正数权值c,c越小,表

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

编程思想:如何设计一个好的通信网络协议

当网络中两个进程需要通信时,我们往往会使用 Socket 来实现.Socket 都不陌生.当三次握手成功后,客户端与服务端就能通信,并且,彼此之间通信的数据包格式都是二进制,由 TCP/IP 协议负责传输. 当客户端和服务端取得了二进制数据包后,我们往往需要『萃取』出想要的数据,这样才能更好的执行业务逻辑.所以,我们需要定义好数据结构来描述这些二进制数据的格式,这就是通信网络协议.简单讲,就是需要约定好二进制数据包中每一段字节的含义,比如从第 n 字节开始的 m 长度是核心数据,有了这样的约定后