Vijos——T1626 愛在心中
阿新 • • 發佈:2017-06-06
能夠 next edge 成功 sca 一個 的人 tool algo
https://vijos.org/p/1626
描述
“每個人都擁有一個夢,即使彼此不相同,能夠與你分享,無論失敗成功都會感動。愛因為在心中,平凡而不平庸,世界就像迷宮,卻又讓我們此刻相逢Our Home。”
在愛的國度裏有N個人,在他們的心中都有著一個愛的名單,上面記載著他所愛的人(不會出現自愛的情況)。愛是具有傳遞性的,即如果A愛B,B愛C,則A也愛C。
如果有這樣一部分人,他們彼此都相愛,則他們就超越了一切的限制,用集體的愛化身成為一個愛心天使。
現在,我們想知道在這個愛的國度裏會出現多少愛心天使。而且,如果某個愛心天使被其他所有人或愛心天使所愛則請輸出這個愛心天使是由哪些人構成的,否則輸出-1。
格式
輸入格式
第1行,兩個數N、M,代表愛的國度裏有N個人,愛的關系有M條。
第2到第M+1行,每行兩個數A、B,代表A愛B。
輸出格式
第1行,一個數,代表愛的國度裏有多少愛心天使。
第2行,如果某個愛心天使被其他所有人和愛心天使所愛則請輸出這個愛心天使是由哪些人構成的(從小到大排序),否則輸出-1。
樣例1
樣例輸入1
6 7
1 2
2 3
3 2
4 2
4 5
5 6
6 4
Copy
樣例輸出1
2
2 3
Copy
樣例2
樣例輸入2
3 3
1 2
2 1
2 3
Copy
樣例輸出2
1
-1
Copy
限制
各個測試點1s
提示
對於40%的數據 N<=10 M<=100
對於80%的數據 N<=100 M<=1000
對於100%的數據 N<=1000 M<=10000
來源
Cai0715 原創
NOIP 2009·Dream Team 模擬賽 第一期 第四題
描述裏的 “如果某個愛心天使被其他所有人或愛心天使所愛則請輸出這個愛心天使是由哪些人構成的” 的 或 應該是 和
不會自愛->原圖裏不會有獨立點
第一問就是 縮點後新點個數 ,第二問 被所有人愛->出度為0 (要註意新圖 出現 愛心天使自愛的情況)~~~
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int N(10000*5); 7 int n,m,u,v; 8 9 int head[N],sumedge; 10 struct Edge 11 { 12 int u,v,next; 13 Edge(int u=0,int v=0,int next=0): 14 u(u),v(v),next(next){} 15 }edge[N<<1]; 16 void ins(int u,int v) 17 { 18 edge[++sumedge]=Edge(u,v,head[u]); 19 head[u]=sumedge; 20 } 21 22 int dfn[N],low[N],tim; 23 int Stack[N],instack[N],top; 24 int point[N],col[N],sumcol; 25 void DFS(int now) 26 { 27 low[now]=dfn[now]=++tim; 28 Stack[++top]=now;instack[now]=1; 29 for(int i=head[now];i;i=edge[i].next) 30 { 31 int to=edge[i].v; 32 if(instack[to]) low[now]=min(low[now],dfn[to]); 33 else if(!dfn[to]) 34 DFS(to),low[now]=min(low[now],low[to]); 35 } 36 if(low[now]==dfn[now]) 37 { 38 col[now]=++sumcol; 39 point[sumcol]++; 40 for(;Stack[top]!=now;top--) 41 { 42 int Top=Stack[top]; 43 col[Top]=sumcol; 44 instack[Top]=0; 45 point[sumcol]++; 46 } 47 instack[now]=0;top--; 48 } 49 } 50 51 int if_,ans,cn,cnt,an[N],s[N],cd[N]; 52 53 int main() 54 { 55 scanf("%d%d",&n,&m); 56 for(int i=1;i<=m;i++) 57 scanf("%d%d",&u,&v),ins(u,v); 58 for(int i=1;i<=n;i++) 59 if(!dfn[i]) DFS(i); 60 for(int i=1;i<=m;i++) 61 if(col[edge[i].u]!=col[edge[i].v]) 62 cd[col[edge[i].u]]++; 63 for(int i=1;i<=sumcol;i++) 64 { 65 if(point[i]>1&&!cd[i]) s[++cn]=i; 66 if(point[i]>1) ans++; 67 } 68 printf("%d\n",ans); 69 if(cn==1) 70 { 71 for(int i=1;i<=n;i++) 72 if(col[i]==s[cn]) an[++cnt]=i; 73 sort(an+1,an+cnt+1); 74 for(int i=1;i<=cnt;i++) 75 printf("%d ",an[i]); 76 if_=1; 77 } 78 if(!if_) printf("-1\n"); 79 return 0; 80 }
Vijos——T1626 愛在心中