2014年3月6日 星期四
[HOJ] 330 - Crayfish
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
#define N 20005
vector<int> s[N],scc[N];
stack<int> sta;
int dfs_cnt=0,pre[N]={0},sccno[N]={0},scc_cnt=0,is[N]={0},add[N]={0};
int dfs(int u){
int lowu,lowv,i;
lowu=pre[u]=++dfs_cnt;
sta.push(u);
for(i=0;i<s[u].size();i++){
int v=s[u][i];
if(pre[v]==0){
lowv=dfs(v);
lowu=min(lowu,lowv);
}
else if(pre[v]<pre[u] && sccno[v]==0){
lowu=min(lowu,pre[v]);
}
}
if(lowu==pre[u]){
++scc_cnt;
while(sta.size()){
int x=sta.top();
sta.pop();
sccno[x]=scc_cnt;
scc[scc_cnt].push_back(x);
if(x==u) break;
}
}
return lowu;
}
int main(){
int n,m,i,j,x,y,z;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&z);
if(z==1){
s[y].push_back(x+n);
s[x+n].push_back(y);
}
else{
s[y].push_back(x);
s[x+n].push_back(y+n);
}
}
for(i=1;i<=n;i++){
if(pre[i]==0){
dfs(i);
}
}
for(i=1;i<=scc_cnt;i++){
int tmp=0;
for(j=0;j<scc[i].size();j++){
int u=scc[i][j];
if(u>n) u-=n;
if(is[u]==0){
tmp++;
is[u]=1;
}
}
for(j=0;j<scc[i].size();j++){
int u=scc[i][j];
if(u>n) u-=n;
is[u]=0;
}
add[i]=tmp;
}
for(i=1;i<=n;i++){
printf("%d\n",add[sccno[i]]-1);
}
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言