第一反应是用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