您的位置:首页 > 其它

POJ,3177 Redundant Paths

2017-05-08 18:27 337 查看
题意:奶牛要在n个牧场中转移,奶牛们厌倦了只有一条路可以走,所以请你来加最少的路,让牧场之间不止有一条固定的通路。

思路:构造双连通图的问题,可以看下面的文章了解一下概念:
https://www.byvoid.com/zhs/blog/biconnect
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAX 5000
bool Map[MAX+10][MAX+10],vis[MAX+10];
int low[MAX+10],dfn[MAX+10],value[MAX+10];
int n,m;
int c=0;
void dfs(int u,int pre)
{
vis[u]=1;
low[u]=dfn[u]=++c;
for(int i=1;i<=n;i++)
{
if(Map[u][i])
{
if(!vis[i])
{
dfs(i,u);
low[u]=min(low[u],low[i]);
}
else if(i!=pre)
low[u]=min(low[u],dfn[i]);
}
}
}
int main()
{
cin.sync_with_stdio(false);
int temp1,temp2;
while(cin>>n>>m)
{
memset(Map,0,sizeof(Map));
while(m--)
{
cin>>temp1>>temp2;
Map[temp1][temp2]=Map[temp2][temp1]=1;
}
memset(vis,0,sizeof(vis));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(value,0,sizeof(value));
c=0;
dfs(1,1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(Map[i][j])
if(low[i]!=low[j])
{
value[low[j]]++;
}
int ans=count(value,value+n+1,1);
cout<<(ans+1)/2<<'\n';
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: