参考了:
但仍有一个case段错误:
#include#include #include #define N 1000+1using namespace std;int deepest[N];int visit[N];//edge[i]标示与i连接的点的序列vector edge[N];//对点进行深度优先搜索得到最大深度int dfs(int v){ //已经被访问过了 if(visit[v] == 1) return 0; visit[v] = 1; //不连接其他点,此时的深度为1 if(edge[v].size() == 0) return 1; int i; int max = 0; for(i=0; i max) max = tmp; } } //加上本层 return max + 1;}int main(){ //freopen("in.txt","r",stdin); memset(deepest,0,sizeof(deepest)); memset(visit,0,sizeof(visit)); int n,a,b; scanf("%d", &n); while(scanf("%d %d",&a,&b)!=EOF){ edge[a].push_back(b); edge[b].push_back(a); } int i,j; int maxdeep = 0; int flag = 0;//标志对点i进行dsf完后,是否还有点未被访问到,若有,说明图不是联通的 for(i=1; i<=n; i++){ //若图是连通的,每次dfs前将visit清空 if(flag == 0) memset(visit,0,sizeof(visit)); deepest[i] = dfs(i); if(deepest[i] > maxdeep) maxdeep = deepest[i] ; //一趟 dfs完了,仍有点未被访问,说明图不是连通的 for(j=i; j<=n; j++){ if(visit[j] == 0){ flag ++; //下一次从点j开始 i = j-1;//i++后就是j break;//退出for j的循环 } } } if(flag == 0){ for(i=1; i<=n; i++){ if(deepest[i] == maxdeep) printf("%d\n",i); } }else{ printf("Error: %d components\n",flag+1); } return 0;}