这段代码有个测试点超时了,咋看没啥问题,就是dfs的时候,一个顶点会检查所有和他有关联的顶点.
然而当我把一个点的所有关联点组成一个列表之后,依然会超时.这个时候复杂度其实已经比较低了.
那么为啥呢?我找了下网上的代码,一些也是超时,有一个没有超时,逻辑跟我也没啥差距.
只是我用的cin cout,他用的scanf,printf
cin的效率确实比scanf效率差不少,而且这个操作也是o(n)个的
换了之后,不再超时.
c++亦会超时. 稍微有点常识的人都能看出,如果我们继续用java写下去…
#include<iostream>
#include<map>
#include<stdlib.h>
#include<string.h>
using namespace std;
int n,m,k;
int count[1000][1000];
int visited[1000];
void dfs(int index){
visited[index] = 1;
for(int i = 0;i<n;i++){
if(count[index][i] != 0){
if(visited[i] == 0){
visited[i] = 1;
dfs(i);
}
}
}
}
int main(){
cin>>n>>m>>k;
for(int i = 0;i<m;i++){
int from;
int to;
cin>>from>>to;
count[from-1][to-1] = 1;
count[to-1][from-1] = 1;
}
for(int i = 0;i<k;i++){
int cnt = 0;
int index;
cin>>index;
index = index -1;
memset(visited,0,sizeof(visited));
visited[index] = 1;
for(int j = 0;j<n;j++){
if(visited[j] == 0){
dfs(j);
cnt++;
}
}
cout<<cnt-1<<endl;
}
}