Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
貌似不是精度的问题AC Code: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn=105; const int maxm=1005; const int maxl=4*(maxn+maxm); const int inf=1000000000; const double zero=1e-10; int n,m,L,S,T,ans; int E[maxl],pre[maxl],A[maxm],B[maxm]; int fst[maxn],d[maxn],q[maxn],dist[maxn],vis[maxn],V[maxn]; double w[maxl]; void add(int a,int b,double c) { E[L]=b; w[L]=c; pre[L]=fst[a]; fst[a]=L++; E[L]=a; w[L]=0; pre[L]=fst[b]; fst[b]=L++; } void init() { memset(d,0,sizeof(d)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&A[i],&B[i]); d[A[i]]++; d[B[i]]++; } } void create(double g) { memset(fst,255,sizeof(fst)); memset(pre,255,sizeof(pre)); L=S=0; T=n+1; for(int i=1;i<=n;i++) add(S,i,m),add(i,T,m+2*g-d[i]); for(int i=1;i<=m;i++) add(A[i],B[i],1),add(B[i],A[i],1); } bool bfs() { int head,tail; memset(q,0,sizeof(q)); memset(dist,255,sizeof(dist)); head=1; tail=2; q[1]=S; dist[S]=0; while(head<tail) { int u=q[head]; for(int k=fst[u];k!=-1;k=pre[k]) if(w[k]>zero && dist[E[k]]==-1) dist[E[k]]=dist[u]+1,q[tail++]=E[k]; head++; } return(dist[T]!=-1); } double dfs(int u,double flow) { double sum=0; if(u==T) return flow; for(int k=fst[u];k!=-1;k=pre[k]) if(w[k]>zero && dist[E[k]]==dist[u]+1) { double tmp=dfs(E[k],min(flow,w[k])); w[k]-=tmp; w[k^1]+=tmp; sum+=tmp; flow-=tmp; if(flow<=zero) break; } return sum; } void find(int u) { vis[u]=1; for(int k=fst[u];k!=-1;k=pre[k]) if(w[k]>zero && !vis[E[k]]) V[++ans]=E[k],find(E[k]); } void work() { double low=1.0/n,high=1.0*m,lim=1.0/(n*n)/10,maxflow; while(high-low>lim) { double mid=(low+high)/2; maxflow=0;; create(mid); while(bfs()) maxflow+=dfs(S,inf); if(m*n-maxflow>zero) low=mid; /*******/ else high=mid-lim; } create(low); maxflow=0; //******** while(bfs()) maxflow+=dfs(S,inf); memset(vis,0,sizeof(vis)); ans=0; find(S); if(ans==0) {printf("1\n1\n"); return;} printf("%d\n",ans); sort(V+1,V+ans+1); for(int i=1;i<=ans;i++) printf("%d\n",V[i]); } int main() { init(); work(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator