poj 1523
代码:
#include<iostream>
#include<fstream>
using namespace std;
struct e{
int data;
e *next;
};
e edge[1001];
void add(int i,int j){
e *p=new e;
p->data=j;
p->next=edge[i].next;
edge[i].next=p;
e *q=new e;
q->data=i;
q->next=edge[j].next;
edge[j].next=q;
}
int dfn[1001],v[1001],low[1001];
int index;
void taj(int s){
dfn[s]=low[s]=++index;
int i,j,k;
e *p=edge[s].next;
v[s]=0;
while(p)
{
if(dfn[p->data]==0)
{
taj(p->data);
low[s]=min(low[s],low[p->data]);
if(low[p->data]>=dfn[s])
v[s]++;
}
else
low[s]=min(low[s],dfn[p->data]);
p=p->next;
}
}
int n;
void solve(){
int i,j,k;
for(i=1;i<=n;i++)
if(dfn[i]==0)
{
taj(i);
v[i]--;
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k=0;
while(cin>>i)
{
n=0;
n=max(n,i);
if(i==0) return;
k++;
printf("Network #%d\n",k);
for(int s=1;s<=1000;s++)
edge[s].next=0;
cin>>j;
n=max(n,j);
add(i,j);
while(cin>>i){
if(i==0) break;
n=max(n,i);
cin>>j;
n=max(n,j);
add(i,j);
}
index=0;
memset(dfn,0,sizeof(dfn));
solve();
j=0;
for(i=1;i<=n;i++)
if(v[i]>0)
{
j=1;
printf(" SPF node %d leaves %d subnets\n",i,1+v[i]);
}
if(j==0)
printf(" No SPF nodes\n");
cout<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号