tarjan算法,枚举割点(注意此题无向图可能不连通),每个割点分割后最大块数+连通分量-1即可。开始老是TLE,后来比较了他人代码,只在vector<vector<int.>.>,用全局变量即可,用局部TLE。记住教训。
#include//600+MS/5000MS#include #include //用这个做链表,保存边,方便。#include using namespace std;int subnet[10001]; //割点i有subnet[i]+1个子网络int dfn[10001];int low[10001];int visited[10001]; //标记访问int time=0; //时间戳int son=0; //DFS树根的孩子结点个数,割点判断条件之一vector >v(10001); //做全局变量时时间降低,若做局部变量,虽然节省空间,用参数传递,时间增加TLE!!!!!!!!!int min(int a,int b){ if(a<=b)return a; return b;}void tarjan(int root,int u,int fa) //dfs{ dfn[u]=low[u]=++time; int daxiao=v[u].size(); for(int i=0;i count) {count=subnet[i]+1;} printf("%d\n",count+countzitu-1); } return 0;}