求无向图的桥的最小权值~
巨坑!!!
如果一开始就不连通的话,就不用派士兵~
如果最小的桥边是0的话,要派一个士兵~
可能两个地方有两座桥连接,这种桥不予考虑,因为怎么拆都连通QAQ
tarjan算法求桥~~~
#include<cstdio> #include<algorithm> #include<vector> #include<stack> #include<cstring> using namespace std; const int maxn=1014; const int inf=1e9; int g[maxn][maxn]; int vis[maxn][maxn]; int N,M,x,y; int low[maxn]; int dfn[maxn]; int cnt; int Min; void init () { fill(low,low+maxn,0); fill(dfn,dfn+maxn,0); Min=inf; for (int i=0;i<maxn;i++) for (int j=0;j<maxn;j++) g[i][j]=inf,vis[i][j]=0; cnt=0; } void tarjan (int x,int pre) { low[x]=dfn[x]=++cnt; for (int i=1;i<=N;i++) { if (i==pre) continue; if (g[x][i]==inf) continue; if (!low[i]) { tarjan(i,x); low[x]=min(low[x],low[i]); if (low[i]>dfn[x]) { if (!vis[x][i]) Min=min(g[x][i],Min); } } else low[x]=min(low[x],dfn[i]); } } int main(){ int u,v,w; while(~scanf("%d%d",&N,&M)) { if (N==0&&M==0) break; init(); for(int i=0;i<M;i++) { scanf("%d%d%d",&u,&v,&w); if (g[u][v]!=inf) vis[u][v]=vis[v][u]=1; else g[u][v]=g[v][u]=w; } tarjan(1,1); for (int i=1;i<=N;i++) if (!dfn[i]) Min=-2; if (Min==-2) printf("0 "); else { if(Min==inf) Min=-1;//没法完成任务 printf("%d ",!Min?1:Min); } } return 0; }