poj1144 tarjan求割点

来源:互联网 发布:在线php解密 编辑:程序博客网 时间:2024/05/16 02:41

今天下午一开始写dinic的模版竟然错了靠浪费了一个小时

从4点开始学tarjan,凑乎理解了以后开始写模版,然后现在刚刚看的lrj的代码求了割点

应该是最基础的题目了吧

今天早晨起晚了浪费了大概一个小时,所以明天早晨3点半起

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<stack>#include<vector>#define MAX 8000using namespace std;int n,x,dfn[MAX],low[MAX],in[MAX],belong[MAX];vector<int>edge[MAX];int y,is_cut[MAX],dfs=0;int tarjan(int x,int fa){dfn[x]=low[x]=++dfs;int child=0;for(int j=0;j<edge[x].size();j++){int i=edge[x][j];if(!dfn[i]){child++;int low_i=tarjan(i,x);low[x]=min(low[x],low_i);if(low_i>=dfn[x])is_cut[x]=1;}elseif(dfn[i]<dfn[x]&&i!=fa)low[x]=min(low[x],dfn[i]);}if(fa<0&&child==1)is_cut[x]=0;return low[x];}void solve(){dfs=0;memset(is_cut,0,sizeof(is_cut));tarjan(1,-1);int numcut=0;for(int u=1;u<=n;u++)if(is_cut[u])numcut++;printf("%d\n",numcut);return ;}void debug(){for(int i=1;i<=n;i++){printf("%d__________________",i);for(int j=0;j<edge[i].size();j++)printf("%d ",edge[i][j]);printf("\n");}return ;}int main(){while(scanf("%d",&n)&&n){for(int i=1;i<=n;i++)edge[i].clear();memset(dfn,0,sizeof(dfn));memset(in,0,sizeof(in));memset(low,0,sizeof(low));while(scanf("%d",&x)&&x)while(getchar()!='\n'){scanf("%d",&y);edge[x].push_back(y);edge[y].push_back(x);}//debug();solve();}return 0;}

0 0
原创粉丝点击