CCF通信网络(水题)

第一反应是用Flody把初始距离为inf,然后右边可达为1

到最后判断每个顶点与其他顶点是不是都可达,如果可达number++;

但是超时了60分 = =

后来发现直接裸个dfs把图遍历一下就直接过了  真尴尬= =

可恶!

60:

#include<iostream>
#include<cstdio>
using namespace std;
const int inf=999999999;
int arc1[1002][1002];
int arc2[1002][1002];
int main()
{
    int n,e;
    cin>>n>>e;
    int i,j,k;
    int x,y;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
    {
        arc1[i][j]=inf;
        arc2[i][j]=inf;
    }
    for(i=0;i<e;i++)
    {
        cin>>x>>y;
        arc1[x][y]=1;
        arc2[y][x]=1;
    }
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                {
                    if(i==j) continue;
                    if(arc1[i][k]+arc1[k][j]<arc1[i][j])
                        arc1[i][j]=arc1[i][k]+arc1[k][j];
                    if(arc2[i][k]+arc2[k][j]<arc2[i][j])
                        arc2[i][j]=arc2[i][k]+arc2[k][j];
                }
            }
    int count=0;
    for(i=1;i<=n;i++)
    {
        int flag=1;
        for(j=1;j<=n;j++)
        {
            if(i==j) continue;
            if(arc1[i][j]==inf&&arc1[j][i]==inf&&arc2[i][j]==inf&&arc2[j][i]==inf)
            {
                flag=0;
                break;
            }
        }
        if(flag==1) count++;
    }
    cout<<count<<endl;
    return 0;
}

100:

#include<iostream>
#include<vector>
using namespace std;
int number=0;
int visit1[1002];
int visit2[1002];
vector<int> a1[1002];
vector<int> a2[1002];
void dfs1(int i)
{
    visit1[i]=1;
    int j;
    for(j=0; j<a1[i].size(); j++)
    {
        if(visit1[a1[i][j]]==0) dfs1(a1[i][j]);
    }
}
void dfs2(int i)
{
    visit2[i]=1;
    int j;
    for(j=0; j<a2[i].size(); j++)
        if(visit2[a2[i][j]]==0) dfs2(a2[i][j]);
}
int main()
{
    int n,e;
    int i;
    int x,y;
    cin>>n>>e;
    for(i=0; i<e; i++)
    {
        cin>>x>>y;
        a1[x].push_back(y);
        a2[y].push_back(x);
    }
    for(i=1; i<=n; i++)
    {
        int flag=1;
        int j;
        for(j=1; j<=n; j++)
        {
            visit1[j]=0;
            visit2[j]=0;
        }
        dfs1(i);
        dfs2(i);
        for(j=1; j<=n; j++)
            if(visit1[j]==0&&visit2[j]==0)
            {
                flag=0;
                break;
            }
        if(flag==1) number++;
    }
    cout<<number<<endl;
    return 0;
}

0.0

猜你喜欢

转载自blog.csdn.net/qq_40458569/article/details/81272892