oblem A:求权值最小的割边就好了.
注意几个坑点 割边权值为0时 至少要派一人.
这题数据似乎无重边
#include <bits/stdc++.h>
using namespace std;
const int N=2e3+5;
const int M=1e6+5;
struct EDGE{
int u,v,id,next,w;
}edge[M*2];
int first[N],low[N],dfn[N],bri[M];
int g,cnt,top;
map<int,int> mp[N];
void AddEdge(int u,int v,int w,int id)
{
edge[g].u=u;
edge[g].v=v;
edge[g].id=id;
edge[g].w=w;
edge[g].next=first[u];
first[u]=g++;
}
void dfs(int u,int fa)
{
int i,v;
low[u]=dfn[u]=++cnt;
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(i==(fa^1))
continue;
if(!dfn[v])
{
dfs(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])
bri[top++]=i;
}
else
low[u]=min(low[u],dfn[v]);
}
}
int main()
{
int t,n,m,u,v,w;
while(~scanf("%d%d",&n,&m)&&(n+m))
{
for(int i=1;i<=n;i++)
mp[i].clear();
g=cnt=top=0;
memset(first,-1,sizeof(first));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
AddEdge(u,v,w,i);
AddEdge(v,u,w,i);
mp[u][v]++,mp[v][u]++;
}
int res=0;
for(int i=1;i<=n;i++)
{
if(!dfn[i])
res++,dfs(i,-1);
}
if(res>1)
{
puts("0");
continue;
}
int ans=1e9;
for(int i=0;i<top;i++)
{
int id=bri[i];
int u=edge[id].u,v=edge[id].v;
if(mp[u][v]==1)
ans=min(ans,edge[id].w);
}
if(ans==1e9)
ans=-1;
if(ans==0)
ans=1;
printf("%d\n",ans);
}
return 0;
}