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;
}

posted on 2011-05-27 09:46  宇宙吾心  阅读(211)  评论(0)    收藏  举报

导航