题目大意:给出一些字符串网络联通图,问有多少个关键路径破坏后使图不连通,若图本身不连通的时候就直接输出0
程序:
#include"string.h"
#include"stdio.h"
#include"iostream"
#include"stdlib.h"
#define M 10009
#define inf 999999999
#include"map"
#include"string"
using namespace std;
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
struct st
{
int u,v,next;
}edge[M*30];
int head[M],dfn[M],low[M],bridge[M],n,t,index,num,flag;
char mp1[M][33];
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
void tarjan(int u,int id)
{
dfn[u]=low[u]=++index;
int i;
for(i=head[u];i!=-1;i=edge[i].next)
{
if(i==(1^id))continue;
int v=edge[i].v;
if(!dfn[v])
{
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])
bridge[num++]=i;
}
low[u]=min(low[u],dfn[v]);
}
}
void solve()
{
index=num=flag=0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
flag++;
tarjan(i,-1);
}
}
}
int main()
{
int T,m,i;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int k=1;
init();
map<string,int>mp;
while(m--)
{
char ch1[33],ch2[33];
scanf("%s%s",ch1,ch2);
if(mp[ch1]==0)
mp[ch1]=k++;
if(mp[ch2]==0)
mp[ch2]=k++;
int x=mp[ch1];
int y=mp[ch2];
add(x,y);
add(y,x);
strcpy(mp1[x],ch1);
strcpy(mp1[y],ch2);
}
solve();
if(flag>1)
{
printf("0\n");
continue;
}
qsort(bridge,num,sizeof(bridge[0]),cmp);
printf("%d\n",num);
for(i=0;i<num;i++)
{
int j=bridge[i];
j=j/2*2;
int u=edge[j].u;
int v=edge[j].v;
printf("%s %s\n",mp1[u],mp1[v]);
}
}
}
本文介绍了一个解决HDU3849问题的方法,该问题是关于通过判断某些路径被移除后是否会导致图变得不连通。文章提供了一段C++代码,实现了tarjan算法来找出所有桥接点,并据此判断图的连通性。
字符串+map容器(hdu3849)&spm=1001.2101.3001.5002&articleId=22695477&d=1&t=3&u=c8a34ecd68a344858cc734e39fd25f68)
1845

被折叠的 条评论
为什么被折叠?



