hdu4738(求图中的桥)

来源:互联网 发布:网络本科留学 编辑:程序博客网 时间:2024/05/02 22:09

按照自己的理解写的,v【u】【v】来判是否有重边


#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int N=1009; struct aa{int to,pre,v;}edge[1000009];int low[N],vv[N][N],cnt,dfn[N],tot,n,m,id=0,head[N],ans,fa[N];bool b[N];void addedge(int x,int y,int z){edge[++tot].to=y;edge[tot].pre=head[x];head[x]=tot;edge[tot].v=z;}void dfs1(int u){b[u]=true;cnt++;for (int i=head[u];i;i=edge[i].pre) if (!b[edge[i].to]) dfs1(edge[i].to);}void dfs(int u)//求桥{dfn[u]=low[u]=++id;for (int i=head[u];i;i=edge[i].pre){int v=edge[i].to;if (v==fa[u]) continue;if (!dfn[v]) {fa[v]=u;dfs(v);if (low[v]>dfn[u]&&vv[u][v]==1) ans=min(ans,edge[i].v);low[u]=min(low[u],low[v]);}else low[u]=min(low[u],dfn[v]);}}void work(){memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));id=0;memset(fa,0,sizeof(fa));dfs(1);}int main(){int x,y,z;while (true){scanf("%d%d",&n,&m);if (n==0&&m==0) break;memset(head,0,sizeof(head));memset(vv,0,sizeof(vv));tot=0;for (int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);addedge(x,y,z);addedge(y,x,z);vv[x][y]++;vv[y][x]++;}cnt=0;memset(b,false,sizeof(b));dfs1(1);ans=0x3f3f3f3f;work();if (cnt<n) printf("0\n");else if (ans==0x3f3f3f3f) printf("-1\n");else if (ans==0) printf("1\n");else printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击