UVA 11770 Lighting Away

來源:互聯網
上載者:User

標籤:style   blog   http   使用   os   io   width   2014   

RunID

User

Problem

Result

Memory

Time

Language

Length

Submit Time

2482977

zhyfzy

J

Accepted

0 KB

138 ms

C++ 4.8.2

2322 B

2014-07-24 15:18:54

【題目大意】

一個有向圖,每對一個結點操作,就可以觸發連鎖反應,使得該結點及它直接或間接指向的點均獲得標記,問至少需要操作多少個結點使得所有結點獲得標記

【題解】

縮點+DFS

首先能想到入度為0的點一定需要操作,但是操作完所有入度為0的點不一定使所有結點獲得標記,比如存在環的情況,因此,我們需要先縮點,縮點使用Tarjan演算法,詳見代碼,縮點之後直接統計入度為0的點有多少個即可。

代碼採用鏈式向前星的儲存結構

【代碼】

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<stack>#define P 20000#define E 200000using namespace std;int i,j,k,n,T,ans,K,m,x,y,indexs,nn,mm;int ru[P],head[P],head2[P],dfn[P],low[P],instack[P],belong[P];bool b[E];stack <int> tar; struct node{int from;int to;int next;}map[E],map2[E];void addedge(int num,int x,int y){map[num].from=x;map[num].to=y;map[num].next=head[x];head[x]=num;}void addedge2(int num,int x,int y){//printf("NewEdge %d %d\n",x,y); ru[y]++;map2[num].from=x;map2[num].to=y;map2[num].next=head2[x];head2[x]=num;}void dfs(int p){for (int i=head2[p];i!=-1;i=map2[i].next){if (!b[map2[i].to]){b[map2[i].to]=true;dfs(map2[i].to);}}}void tarjan(int k){    int p;    tar.push(k);    instack[k]=1;    dfn[k]=low[k]=++indexs;    for(int j=head[k];j!=-1;j=map[j].next)    {        p=map[j].to;        if (instack[p]) {low[k]=min(low[k],dfn[p]);}        else if(dfn[p]==-1)        {            tarjan(p);            low[k]=min(low[k],low[p]);        }    }    if(low[k]==dfn[k])    {        nn++;        do        {            j=tar.top();            tar.pop();            instack[j]=0;            belong[j]=nn;        }while(j!=k);    }}void build_new_map(){    for(int i=1;i<=m;i++)    {        if(belong[map[i].from]==belong[map[i].to]) continue;        addedge2(++mm,belong[map[i].from],belong[map[i].to]);    }}void build_map(){scanf("%d%d",&n,&m);for (i=1;i<=m;i++){scanf("%d%d",&x,&y);addedge(i,x,y);}memset(dfn,-1,sizeof(dfn));memset(low,-1,sizeof(low));memset(instack,0,sizeof(instack));indexs=0;nn=0;for (i=1;i<=n;i++) belong[i]=i;for (i=1;i<=n;i++){if (dfn[i]==-1)tarjan(i);}build_new_map();}int main(){scanf("%d",&T);while (++K<=T){memset(map,-1,sizeof(map));memset(head,-1,sizeof(head));memset(map2,-1,sizeof(map2));memset(head2,-1,sizeof(head2));memset(b,0,sizeof(b));memset(ru,0,sizeof(ru));ans=0;mm=0;nn=0;build_map();for (i=1;i<=nn;i++){if (!ru[i]){ans++;b[i]=true;dfs(i);}}for (i=1;i<=nn;i++){if (!b[i]){ans++; b[i]=true;dfs(i);}}printf("Case %d: %d\n",K,ans);}}

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.