您的位置:首页 > 其它

poj1523——SPF

2010-12-22 20:09 423 查看
http://poj.org/problem?id=1523

这道题目是图论题目。个人采用暴力深搜解决。思路如下:

1.
首先采用邻接表的方法来存储图形信息。

2.
采用color数组作为标记,标记某一节点是否已经访问。

3.
从小到大遍历该图中的所有结点,判断该结点是否为SPF

4.
对于某一个节点是否为SPF,我的方法是:

去掉该结点,进行深搜,如果分支数为1,说明该结点非SPF。如果非1,说明该结点为对应分支数的SPF。

5.
需要注意输出SPF结点时,前面需要空两格,然后每个case输出一个空行。题目中的测试数据应该不大,不然不可能0ms通过。

#include <iostream>
using namespace std;
typedef struct node
{
int key;
node *next;
}node;
node data[1001];
bool color[1001];
int maxnum;
void input()
{
int a,b;
while(scanf("%d",&a)!=EOF && a!=0)
{
if(a>maxnum)
maxnum = a;
scanf("%d",&b);
if(b>maxnum)
maxnum = b;
node *n1 = new node(),*n2 = new node();
n1->key = a;
n2->key = b;
n1->next = data[b].next;
n2->next = data[a].next;
data[a].next = n2;
data[b].next = n1;
}
}
void init()
{
maxnum = 0;
for(int i=0;i<1001;i++)
{
data[i].key = i;
data[i].next = NULL;
}
}
bool dfsVisit(int a,int j)
{
node* temp = data[j].next;
if(data[j].key == a || color[j] || temp == NULL)
return false;
color[j] = true;
while(temp != NULL)
{
dfsVisit(a,temp->key);
temp = temp->next;
}
return true;
}
void clear()
{
for(int i=0;i<1001;i++)
color[i] = false;
}
int dfs(int a)
{
clear();
int num = 0;
for(int i=0;i<maxnum;i++)
{
if(dfsVisit(a,i+1))
num++;
}
return num;
}
//释放空间
void del()
{
for(int i=0;i<=maxnum;i++)
{
node *temp = data[i].next;
while(temp != NULL)
{
data[i].next = temp->next;
delete temp;
temp = data[i].next;
}
}
}

int main()
{
int num = 1;
init();
input();
while(maxnum!=0)
{
bool flag = false;
cout<<"Network #"<<num<<endl;
for(int i=0;i<maxnum;i++)
{
int result = dfs(i+1);
if(result != 1)
{
cout<<"  SPF node "<<i+1<<" leaves "<<result<<" subnets"<<endl;
flag = true;
}
}
if(!flag)
cout<<"  No SPF nodes"<<endl;
cout<<endl;
del();
init();
input();
num++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: