#include<cstdio>
#include<cstring>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,ans,id[1010],v[1010],inw[1010],pre[1010];
struct node{
int u,v,w;
node(int a=0,int b=0,int c=0){
u=a;
v=b;
w=c;
}
};
vector<node> g;
int ZhuLiu(int root){
ans=0;
while(1){
for(int i=0;i<n;i++){
inw[i]=INF;
id[i]=v[i]=pre[i]=-1;
}
for(int i=0;i<g.size();i++){
if(g[i].w<inw[g[i].v] && g[i].v != g[i].u){
inw[g[i].v]=g[i].w;
pre[g[i].v]=g[i].u;
}
}
pre[root]=root;inw[root]=0;
for(int i=0;i<n;i++){
if(inw[i] == INF)
return 0;
ans+=inw[i];
}
int idx=0;
for(int i=0;i<n;i++){
if(v[i]==-1){
int t=i;
while(v[t]==-1){
v[t]=i;
t=pre[t];
}
if(v[t]!=i || t==root) continue;
id[t]=idx++;
for(int j=pre[t];j!=t;j=pre[j]) id[j]=idx-1;
}
}
if(idx == 0) return 1;
for(int i=0;i<n;i++){
if(id[i]==-1)
id[i]=idx++;
}
for(int i=0;i<g.size();i++){
g[i].w-=inw[g[i].v];
g[i].u=id[g[i].u];
g[i].v=id[g[i].v];
}
n=idx;
root=id[root];
}
}
int main(){
int T,t=1;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
g.clear();
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g.push_back(node(a,b,c));
}
printf("Case #%d: ",t++);
if(ZhuLiu(0)) printf("%d\n",ans);
else printf("Possums!\n");
}
return 0;
}
uva 11183 有向图最小生成树
最新推荐文章于 2019-08-11 10:10:21 发布