给出一个图,现在只能切除一个路使得整个图不联,每条路都有保安(w个),要切除这条路需要至少需要人力w人。问图要使得整个图不连通需要的最少人力。
题解:
这题有一个坑点,就是如果路上没有保安的情况,这种情况也是需要有人去切除路的,所以至少1人。这题有重边。。。
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<vector> #include<queue> #include<map> #include<set> using namespace std; #define B(x) (1<<(x)) typedef long long ll; void cmax(int& a,int b){ if(b>a)a=b; } void cmin(int& a,int b){ if(b<a)a=b; } const int oo=0x3f3f3f3f; const int MOD=1000000007; const int maxn=1100; const int maxm=2100000; struct EDGE{ int v,next,w; }E[maxm]; int head[maxn],tol; int low[maxn],dfn[maxn]; int g_cnt; int ans; void Init() { memset(head,-1,sizeof head); tol=0; memset(low,0,sizeof low); memset(dfn,0,sizeof dfn); g_cnt=0; ans=oo; } void add_edge(int u,int v,int w) { E[tol].w=w; E[tol].v=v; E[tol].next=head[u]; head[u]=tol++; } void Tarjan(int u,int pre) { dfn[u]=low[u]=++g_cnt; int v; for(int i=head[u];i!=-1;i=E[i].next) { if(i==(pre^1))continue; v=E[i].v; if(!dfn[v]) { Tarjan(v,i); if(low[v]<low[u]) low[u]=low[v]; if(low[v]>dfn[u]) cmin(ans,E[i].w); }else if(dfn[v]<low[u]) low[u]=dfn[v]; } } int main(){ //freopen("E:\read.txt","r",stdin); int n,m,u,v,w; while(scanf("%d %d",&n,&m)!=EOF) { if(n==0&&m==0)break; Init(); for(int i=1;i<=m;i++) { scanf("%d %d %d",&u,&v,&w); add_edge(u,v,w); add_edge(v,u,w); } int cnt=0; for(int i=1;i<=n;i++) if(!dfn[i]) { cnt++; Tarjan(i,-1); } if(cnt>1) //如果不联通的话,输出0 ans=0; else if(ans==oo) // ans=-1; else if(ans==0) //有可能桥上没有人,这时要输出1 ans=1; printf("%d ",ans); } return 0; }