【未完待续】练习场hit1007:spf

题目:

  给一张无向图,求其所有spf节点

Sample Input

1 2
5 4
3 1
3 2
3 4
3 5
0

1 2
2 3
3 4
4 5
5 1
0

1 2
2 3
3 4
4 6
6 3
2 5
5 1
0

0

Sample Output

Network #1
  SPF node 3 leaves 2 subnets

Network #2
  No SPF nodes

Network #3
  SPF node 2 leaves 2 subnets
  SPF node 3 leaves 2 subnets

思路:

  (明知道这道题是用图算法的一些东西做的,明知道你丫还没看图算法呢,还特么碰。果然,卡了吧,该。)

  遍历去掉每个节点,计算去掉该节点之后形成了多少个子网,即为结果。

 

方案:

  先将所给一条条连接快排,得到网络内节点个数amount,从1遍历至amount,生成subnet数组,长度为amount+1:0 1-amount,计算会形成多少个子网。

 

代码:

【未完待续】练习场hit1007:spf
 1 void NetCheck(Net *tab,int con_cnt,int  net_cnt)
 2 {
 3     int tmp;
 4     int i;
 5     for(i=0;i<=con_cnt-1;++i)
 6         if(tab[i].bin>tab[i].end)
 7         {
 8             tmp=tab[i].bin;
 9             tab[i].bin=tab[i].end;
10             tab[i].end=tmp;
11         }
12     qsort(tab,con_cnt,sizeof(Net),comp);
13     int amount=tab[con_cnt-1].end;
14     
15     int node,sub_net_cnt,start,cur,spf_mark=0,j;
16     int *subnet=(int *)malloc(sizeof(int)*(amount+1));
17     printf("Network #%d\n",net_cnt);
18     for(node=1;node<=amount;++node)
19     {
20         if(node==1)
21             start=2;
22         else
23             start=1;
24         sub_net_cnt=0;
25         memset(subnet,0,sizeof(int)*(amount+1));
26         subnet[node]=-1;
27         while(start<=amount)
28         {
29             subnet[start]=++sub_net_cnt;
30             for(i=0;i<=con_cnt-1;++i)
31             {
32                 if(tab[i].bin==node||tab[i].end==node)
33                     continue;
34                 if(subnet[tab[i].bin]==sub_net_cnt)
35                 {
36                     if(subnet[tab[i].end]!=0&&subnet[tab[i].end]!=sub_net_cnt)
37                     {
38                         --sub_net_cnt;
39                         for(j=1;j<=amount;++j)
40                             if(subnet[j]==subnet[tab[i].end])
41                                 subnet[j]=sub_net_cnt;
42                     }
43                     subnet[tab[i].end]=sub_net_cnt;
44                 }
45                 else if(subnet[tab[i].end]==sub_net_cnt)
46                 {
47                     if(subnet[tab[i].bin]!=0&&subnet[tab[i].bin]!=sub_net_cnt)
48                     {
49                         --sub_net_cnt;
50                         for(j=1;j<=amount;++j)
51                             if(subnet[j]==subnet[tab[i].end])
52                                 subnet[j]=sub_net_cnt;
53                     }
54                     subnet[tab[i].bin]=sub_net_cnt;
55                 }
56             }
57             while(start<=amount&&subnet[start]!=0)
58                 ++start;
59         }
60         if(sub_net_cnt>1)
61         {
62             spf_mark=1;
63             printf("  SPF node %d leaves %d subnets\n",node,sub_net_cnt);
64         }
65     }
66     if(spf_mark==0)
67         printf("  No SPF nodes\n");
68 }
69 
70 int comp(const void *a,const void *b)
71 {
72     return ((Net *)a)->end-((Net *)b)->end;
73 }
【未完待续】练习场hit1007:spf

 

记录:

  我勒个去的到目前这版,在基本代至上所进行过的修改:修改了输出规格(每两份网络中间空一行而不是每份网络之后空一行),修改了排序基准以获得最大网络节点号,但还是找不到错误在哪里,结果一直是wrong answer……我决定先放在这里了,恶心了。

心得:

  革命尚未成功,同志们回头努力。

【未完待续】练习场hit1007:spf

上一篇:Kylin


下一篇:GL_Oracle Erp常用的报表(汇总)