zoj1119 SPF

来源:互联网 发布:icloud和阿里云 编辑:程序博客网 时间:2024/05/16 09:06
#include <cstdlib>#include <iostream>#include <queue>#include <stack>using namespace std;struct Edge{       int to;       Edge*next;       void insert(Edge* e)       {            e->next = next;            next = e;       }};class Graph{  private:        Edge** adj;        int n;  public:       Graph(int s);       ~Graph();       void Insert(int i, int j);       void Bfs(int v, int*id, int cid);       void Dfs(int v);       Edge* Remove(int v);       void Insert(Edge* list, int v);       int Components();       bool HasEdge(int v);};Graph::Graph(int s){    n = s;    adj = (Edge**) malloc(sizeof(Edge*)*n);    for (int i = 0; i < n; i++)    {       adj[i] = (Edge*) malloc(sizeof(Edge));       adj[i]->next = NULL;    }}Graph::~Graph(){    for (int v = 0; v<n; v++)    {        Edge* e = adj[v]->next;        while (e)        {              adj[v]->next = e->next;              free(e);              e = adj[v]->next;        }    }    free(adj);}void Graph::Insert(int i, int j){    Edge* ei = (Edge*) malloc(sizeof(Edge));    Edge* ej = (Edge*) malloc(sizeof(Edge));    ei->to = i; ej->to = j;    adj[i]->insert(ej);    adj[j]->insert(ei);}//Remove all edges attaches to vEdge* Graph::Remove(int v){     for (Edge* e = adj[v]->next; e; e=e->next)     {         int w = e->to;         for(Edge*p = adj[w], *eg=p->next; eg; )         {               if (eg->to == v)               {                   p->next = eg->next;                   free(eg);                   eg = p->next;                   break;               }               else               {                   p = eg; eg = eg->next;               }         }     }     Edge *list = adj[v]->next;     adj[v]->next = NULL;     return list;}void Graph::Insert(Edge* list, int v){     adj[v]->next = list;     for (Edge* e = list; e; e = e->next)     {         int w = e->to;         Edge* ee = (Edge*) malloc(sizeof(Edge));         ee->to = v;         adj[w]->insert(ee);     }}bool Graph::HasEdge(int v){     return adj[v]->next && adj[v]->next->next;}void Graph::Bfs(int v, int*id, int cid){     queue<int> Q;     Q.push(v);     id[v]  = cid;     while (!Q.empty())     {       v = Q.front();Q.pop();       Edge* e = adj[v]->next;       while (e)       {           int w =  e->to;           if (!id[w]){               Q.push(w);               id[w] = cid;           }           e = e->next;       }     }}void Graph::Dfs(int v){     int cnt = 2;     int* id = (int*)malloc(sizeof(int)*n);     memset(id, 0, sizeof(int)*n);     id[v] = 1;     stack<Edge*> S;     S.push(adj[v]->next);     while(!S.empty())     {        Edge* e = S.top(); S.pop();        int w = e->to;        if (e->next) S.push(e->next);        if (id[w] == 0){              id[w] = cnt++;              if (adj[w]->next) S.push(adj[w]->next);        }     }      }int Graph::Components(){    int* id = (int*) malloc(sizeof(int)*n);    memset(id, 0, sizeof(int)*n);    int cid = 1;    for (int v = 0; v < n; v++)    {        if (id[v]==0){ Bfs(v, id, cid); cid++; }    }    free(id);    return cid-1;}int main(int argc, char *argv[]){    int t=1;    while(1)    {            Graph g(1001);            int v, w;            int a = 0;            while(scanf("%d", &v), v)            {                  scanf("%d", &w);                  a++;                  g.Insert(v, w);            }            if (a==0) break;            if (t > 1) printf("/n");            printf("Network #%d/n", t++);            int cmp = g.Components(), com;            int cnt = 0;                        for (int i = 1; i < 1001; i++)            {                if (!g.HasEdge(i)) continue;                Edge* list = g.Remove(i);                com = g.Components();                if (com > cmp+1)                {                        cnt++;                        printf("  SPF node %d leaves %d subnets/n", i, com-cmp);                }                g.Insert(list, i);            }            if (cnt == 0) printf("  No SPF nodes/n");    }        }
原创粉丝点击