https://vjudge.net/contest/179107#problem/B
参考https://vjudge.net/solution/3192331
这个地方的超级源点很妙。。。
int n,m,idx,maxx;
int pre[mxn],id[mxn],vis[mxn],in[mxn],tot;
struct edge{
int u,v,w;
}e[mxe];
void add(int u,int v,int w){
e[++tot].u=u,e[tot].v=v,e[tot].w=w;
}
int DMST(int s,int n){
int ret=0;
while(1){
mem(in,inf);
for(int i=1;i<=m;++i){
int u=e[i].u,v=e[i].v,c=e[i].w;
if(c<in[v]&&u!=v){
pre[v]=u,in[v]=c;
if(u==s)
idx=i;
}
}
in[s]=0;
//for(int i=1;i<=m;++i)pf("%d ",e[i].w);puts("");
//for(int i=1;i<=n;++i)pf("%d ",in[i]);puts("");
for(int i=1;i<=n;++i)
if(in[i]==inf)
return -1;
in[s]=0;
int cnt=0;
mem(id,-1);
mem(vis,-1);
for(int i=1;i<=n;++i){
ret+=in[i];
int v=i;
while(vis[v]!=i&&id[v]==-1&&v!=s)
vis[v]=i,v=pre[v];
if(id[v]==-1&&v!=s){
id[v]=++cnt;
for(int u=pre[v];u!=v;u=pre[u])
id[u]=cnt;
}
}
if(cnt==0){
break;
}
for(int i=1;i<=n;++i)if(id[i]==-1)id[i]=++cnt;
for(int i=1;i<=m;++i){
int u=e[i].u,v=e[i].v;
e[i].u=id[u],e[i].v=id[v];
if(id[u]!=id[v])
e[i].w-=in[v];
}
n=cnt;
s=id[s];
}
return ret;
}
int main(){
//freopen("in.txt","r",stdin);
while(~sf("%d%d",&n,&m)){
tot=0;idx=0;
int e=0;
maxx=1;
rep(i,1,m){int u,v,w;sf("%d%d%d",&u,&v,&w);u++;v++;maxx+=w;add(u,v,w);e++;}
rep(i,1,n){ add(n+1,i,maxx); }
m+=n;
int ans=0;
if((ans=DMST(n+1,1+n))>=maxx*2)pf("impossible\n\n");
else pf("%d %d\n\n",ans-(maxx),idx-e-1);
}
}