hdu 3849 (双联通求桥)

来源:互联网 发布:tensorflow syntaxnet 编辑:程序博客网 时间:2024/06/03 13:40

一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,,






#include <iostream>#include <cstring>#include <cstdio>#include <map>#include <string>#include <algorithm>#define N 10001using namespace std;int head[N],num,dfs[N],low[N],n,m,idx,bridge[N],bum;struct edge{int st,ed,next;}E[N*20];void addedge(int x,int y){E[num].st=x;E[num].ed=y;E[num].next=head[x];head[x]=num++;}int cmp(const void *a,const void *b){    return *(int *)a-*(int *)b;}void Tarjan(int u,int father){    int i,v;    low[u]=dfs[u]=idx++;    for(i=head[u];i!=-1;i=E[i].next)    {        v=E[i].ed;        if(v==father)continue;        if(dfs[v]==-1)        {            Tarjan(v,u);            low[u]=low[u]>low[v]?low[v]:low[u];            if(low[v]>dfs[u])//桥            {bridge[bum++]=i;            }        }        else low[u]=low[u]>dfs[v]?dfs[v]:low[u];    }}int main(){int i,x,y,j,t,sum;char str[2][200];scanf("%d",&t);while(t--)    {        scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));num=0;sum=1;map<string,int>mp;        map<int,string>mmp;for(i=0;i<m;i++){scanf("%s%s",str[0],str[1]);if(mp[str[0]]==0){mp[str[0]]=sum;mmp[sum]=str[0];sum++;}if(mp[str[1]]==0){mp[str[1]]=sum;mmp[sum]=str[1];sum++;}x=mp[str[0]];y=mp[str[1]];addedge(x,y);addedge(y,x);}memset(dfs,-1,sizeof(dfs));idx=0;bum=0;Tarjan(1,-1);for(i=1;i<=n;i++)        {            if(dfs[i]==-1)                break;        }        if(i<=n){printf("0\n");continue;}printf("%d\n",bum);qsort(bridge,bum,sizeof(bridge[0]),cmp);for(j=0;j<bum;j++)        {            i=bridge[j];            i=(i/2*2);            x=E[i].st;            y=E[i].ed;            if(x!=y)                printf("%s %s\n",mmp[E[i].st].c_str(),mmp[E[i].ed].c_str());        }}return 0;}


原创粉丝点击