PTA 1013 Battle Over Cities

這段代碼有個測試點超時了,咋看沒啥問題,就是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;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章