什么?有人要炸我的桥?!D飞他(心疼周瑜大都督)
这个就是求割边/桥了。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int n,m; struct node { int x,y,d,t,next; }a[2100000];int len,last[1100]; void ins(int x,int y,int d,int t) { len++; a[len].x=x;a[len].y=y;a[len].d=d;a[len].t=t; a[len].next=last[x];last[x]=len; } int z,dfn[1100],low[1100]; int top,sta[1100]; int bp,bridge[1100000]; void tarjan(int x,int pre) { dfn[x]=low[x]=++z; sta[++top]=x; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(dfn[y]==0) { tarjan(y,k); low[x]=min(low[x],low[y]); } else if(a[pre].t!=a[k].t) low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]) { if(pre!=0) bridge[++bp]=pre; int i; do{ i=sta[top];top--; }while(i!=x); } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0)break; int x,y,d; len=0;memset(last,0,sizeof(last)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&d); ins(x,y,d,i);ins(y,x,d,i); } z=top=bp=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); tarjan(1,0); bool bk=true; for(int i=1;i<=n;i++) if(dfn[i]==0){bk=false;break;} if(bk==false){printf("0 ");continue;} int ans=(1<<30); for(int i=1;i<=bp;i++) ans=min(ans,a[bridge[i]].d); printf("%d ",(ans==(1<<30))?-1:((ans==0)?1:ans)); } return 0; }