1. 程式人生 > >bzoj2438: [中山市選2011]殺人遊戲

bzoj2438: [中山市選2011]殺人遊戲

zoj scan 我只 感冒 -- sta 細節 namespace height

感覺今天狀態起飛了!!!之前留的坑一調就A了,舒服!!!

那麽這題之前一看就覺得,假如一個人沒人認識實際上他必須查一下,那麽我第一次做的時候就把他抽象成了很多棵樹,然後我只查樹根,然後下面的每一層我都知道身份,那就沒有生命之憂了。然後特判一下有一個人沒人認識tata也不認識別人,就是自己獨立出來的,那他最後留下來實際上不用查。

然後實際上這題怎麽可能這麽簡單,肯定會構環的,那麽就考慮強連通縮點,那麽這題難就難在怎麽判最後查剩一個人的情況了,那麽具體怎麽做呢?首先這個點入度肯定為0的,再者這個聯通塊肯定是只有一個點,不然還是需要問的,第三查他所能得知的點入度要>1,否則的話說明這個點必須通過當前這個點才能得知身份,還是需要查他。所以說這題細節還是很多的,搞得那時候感冒暈乎乎的。。。。

#include<cstdio>
#include<iostream> 
#include<cstring>
using namespace std;

int n,m;
struct node
{
    int x,y,next;
}a[310000],e[310000];int len,last[1100000],elen,elast[1100000];
void ins(int x,int y)
{
    len++;
    a[len].x=x;a[len].y=y;
    a[len].next=last[x];last[x]=len;
}
void eins(int x,int y) { elen++; e[elen].x=x;e[elen].y=y; e[elen].next=elast[x];elast[x]=elen; } int id,dfn[1100000],low[1100000]; int top,sta[1100000]; int cnt,belong[1100000],size[1100000]; bool v[1100000]; void strong_unicom(int x) { dfn[x]=low[x]=++id; sta[++top]=x; v[x]=true; for(int
k=last[x];k;k=a[k].next) { int y=a[k].y; if(dfn[y]==0) { strong_unicom(y); low[x]=min(low[x],low[y]); } else if(v[y]==true) { low[x]=min(low[x],dfn[y]); } } if(dfn[x]==low[x]) { int i;cnt++; do { i=sta[top];top--; belong[i]=cnt; v[i]=false; size[cnt]++; }while(i!=x); } } int ru[1100000]; bool check(int x) { if(size[x]!=1)return true; if(elast[x]==0)return false; for(int k=elast[x];k;k=e[k].next) { int y=e[k].y; if(ru[y]<=1)return true; } return false; } int main() { int x,y; scanf("%d%d",&n,&m); len=0;memset(last,0,sizeof(last)); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); ins(x,y); } id=0;top=0;cnt=0; memset(dfn,0,sizeof(dfn)); memset(v,false,sizeof(v)); memset(size,0,sizeof(size)); for(int i=1;i<=n;i++) if(dfn[i]==0) strong_unicom(i); memset(ru,0,sizeof(ru)); elen=0;memset(elast,0,sizeof(elast)); for(int i=1;i<=m;i++) { x=belong[a[i].x],y=belong[a[i].y]; if(x!=y) { ru[y]++; eins(x,y); } } int sum=0; for(int i=1;i<=cnt;i++) if(ru[i]==0)sum++; for(int i=1;i<=cnt;i++) if(ru[i]==0) if(check(i)==false){sum--;break;} printf("%.6lf\n",1.0-double(sum)/double(n)); return 0; }

bzoj2438: [中山市選2011]殺人遊戲