标签:isp first img mod lis eve for lap continue
题意和poj3352一样。。唯一区别就是有重边,预先判断一下就好了
#include<map> #include<set> #include<list> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; using namespace __gnu_cxx; const double g=10.0,eps=1e-7; const int N=5000+10,maxn=100000+10,inf=0x3f3f3f; vector<int>v[N]; int dfn[N],low[N]; int index,num; map<int,int>ma[N]; void tarjan(int u,int f) { low[u]=dfn[u]=++index; for(int i=0;i<v[u].size();i++) { int x=v[u][i]; if(x==f)continue; if(!dfn[x]) { tarjan(x,u); low[u]=min(low[u],low[x]); if(low[x]>dfn[u])ma[x][u]=ma[u][x]=1; } else low[u]=min(low[u],dfn[x]); } } void dfs(int u,int f) { dfn[u]=num; for(int i=0;i<v[u].size();i++) { int x=v[u][i]; if(x!=u&&!dfn[x]&&!ma[x][u])dfs(x,u); } } void init(int n) { memset(dfn,0,sizeof dfn); memset(low,0,sizeof low); index=num=0; for(int i=1;i<=n;i++) { v[i].clear(); ma[i].clear(); } } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { init(n); for(int i=0; i<m; i++) { int a,b; scanf("%d%d",&a,&b); if(!ma[a][b]) { // cout<<a<<" "<<b<<endl; v[a].pb(b); v[b].pb(a); ma[a][b]=ma[b][a]=1; } } for(int i=1;i<=n;i++)ma[i].clear(); for(int i=1; i<=n; i++) if(!dfn[i]) tarjan(i,-1); memset(dfn,0,sizeof dfn); for(int i=1; i<=n; i++) if(!dfn[i]) { ++num; dfs(i,-1); } // cout<<num<<endl; memset(low,0,sizeof low); for(int i=1; i<=n; i++) { for(int j=0; j<v[i].size(); j++) { if(dfn[i]!=dfn[v[i][j]]) { low[dfn[i]]++; low[dfn[v[i][j]]]++; } } } int ans=0; for(int i=1; i<=num; i++) { // cout<<low[i]<<endl; if(low[i]==2) ans++; } printf("%d\n",(ans+1)/2); } return 0; } /************ ************/
标签:isp first img mod lis eve for lap continue
原文地址:http://www.cnblogs.com/acjiumeng/p/7745332.html