ccf 2017-09-04 通信网络 图的遍历

来源:互联网 发布:淘宝情侣装店铺排名 编辑:程序博客网 时间:2024/06/05 17:23

中文题意,不在重复。

开始时用的传递闭包思想,三层循环,结果给了35分,超时了。

后来,看了别人的代码,发现暴力搜图就可以了。

我们只需遍历n个点(发现n才1000。。。),每次都将此时的节点当做起点,然后开始查询通过此点能到达的所有点。

代码:


#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>using namespace std;int flag[1005][1005];int vis[1005];vector<int>V[1005];void dfs(int a,int t){    vis[a]=1;    flag[a][t]=flag[t][a]=1;    for(int i=0;i<V[a].size();i++)    {        if(!vis[V[a][i]])//已经遍历过的点就不要再遍历了        {            dfs(V[a][i],t);        }    }    return;}int main(){    int n,m;    scanf("%d%d",&n,&m);    memset(flag,0,sizeof(flag));    for(int i=0;i<=n;i++)V[i].clear();    int a,b;    for(int i=1;i<=m;i++)    {        scanf("%d%d",&a,&b);        V[a].push_back(b);    }    for(int i=1;i<=n;i++)    {        memset(vis,0,sizeof(vis));        dfs(i,i);    }    int i,j,ans=0;    for(i=1;i<=n;i++)    {        for(j=1;j<=n;j++)        {            if(!flag[i][j]||!flag[j][i])                break;        }        if(j==n+1)ans++;    }    printf("%d\n",ans);}


原创粉丝点击