這段代碼有個測試點超時了,咋看沒啥問題,就是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;
}
}