POJ 2117 Electricity

22 篇文章 0 订阅
   这题用的是求强连通分图的算法Tarjan算法来求的。 用Tarjan算法求每个强连通分图的割点去掉后增加的强连通图数量。取最大的一种, 加上原来的强连通分量的个数, 便是本题的解。要注意在没边的时候ans就是点数 - 1。
<pre name="code" class="cpp">#include <stdio.h>
#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>#define mem(a) memset(a, 0, sizeof(a))using namespace std;int dfn[10005], low[10005], vis[10005], flag, po, eg, cut[10005];struct node{int date;node *next;}point[10005];void tarjan(int s){int i;dfn[s] = low[s] = ++flag;vis[s] = 1;node *q;q = point[s].next;while(q){if(vis[q->date] == 0){tarjan(q->date);if(dfn[s] <= low[q->date])cut[s]++; // 增加的强连通图数量。low[s] = min(low[s], low[q->date]);}else{low[s] = min(low[s], dfn[q->date]);}q = q->next; }}int main(int argc, char *argv[]){int i, j, k, res, ans;for(;;){mem(dfn);mem(low);mem(vis);mem(cut);flag = 0;res = 0;ans = 0;scanf("%d%d",&po, &eg);if(po == 0&&eg == 0)break;if(eg == 0){printf("%d\n", po - 1);continue;}for(i = 0;i < po;i++){point[i].next = 0;}for(i = 0;i < eg;i++){scanf("%d%d",&j, &k); node *q; q = (node*)malloc(sizeof(node)); q->date = j; q->next = point[k].next; point[k].next = q; node *p; p = (node*)malloc(sizeof(node)); p->date = k; p->next = point[j].next; point[j].next = p;}for(i = 0;i < po;i++){if(vis[i] == 0){res++;tarjan(i); cut[i]--; // 因为本来就是一个, 所以要减一。}}for(i = 0;i < po;i++){if(ans < cut[i])ans = cut[i];}printf("%d\n", ans + res);}return 0;}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值