Code: Select all
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <set>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <vector>
#define pi acos(0)
#define inf 20000000000
#define max 10000
#define sz 100
#define true 1
#define false 0
#define pb(a) push_back(a)
#define size(e) (int)e.size()
#define clr(a,b) memset(a,b,sizeof(a))
//ll rw[10] = {0,0,1,-1};
//ll cl[10] = {1,-1,0,0}; /*array for 4-sides move*/
//ll drw[10] = {1,-1,1,-1};
//ll dcl[10] = {1,1,-1,-1}; /*array for diagonal 4-sides move*/
//ll rw[10] = {0,0,1,1,-1,-1};
//ll cl[10] = {1,-1,1,0,-1,0}; /*array for 6-sides move*/
//ll rw[10] = {0,0,1,1,1,-1,-1,-1};
//ll cl[10] = {1,-1,1,0,-1,-1,0,1}; /*array for 8-sides move*/
//ll rw[10] = {0,0,1,-1, 0, 0};
//ll cl[10] = {1,-1,0,0, 0, 0};
//ll hi[10] = {0, 0 ,0, 0, 1, -1}; /*array for 3-D move */
typedef long long int ll;
struct edge
{
ll u, v, c;
bool operator <(const edge& p)const
{
return c < p.c;
}
};
using namespace std;
ll num, m, par[max], mcost, scost, costs[max], got[max];
vector <edge> e;
ll mst();
ll omst(ll a);
ll find(ll a);
int main()
{
ll i, j, n, cas = 1, tst;
edge bin;
scanf("%lld", &tst);
while(cas <= tst)
{
e.clear();
clr(got, 0);
scanf("%lld %lld", &num, &m);
for(i = 0; i < m; ++i)
{
scanf("%lld %lld %lld", &bin.u, &bin.v, &bin.c);
e.pb(bin);
}
mcost = 0;
for(i = 1; i <= num; ++i)
par[i] = i;
for(i = 0; i < size(e); ++i)
costs[i] = inf;
ll c = 0;
c = mst();
printf("Case #%lld : ", cas);
scost = 0;
if(c == num - 1)
{
n = 0;
for(i = 0; i < size(e); ++i)
{
for(j = 1; j <= num; ++j)
par[j] = j;
if(got[i])
{
costs[i] = 0;
c = omst(i);
if(c < num - 1 || costs[i] < mcost)
costs[i] = inf;
if(c == num - 1 && costs[i] >= mcost)
++n;
}
}
if(n == 0)
puts("No second way");
else
{
scost = *min_element(costs, costs + m);
printf("%lld\n", scost);
}
}
else
puts("No way");
++cas;
}
return 0;
}
ll mst()
{
ll i, j, n, p;
ll c = 0;
sort(e.begin(), e.end());
for(i = 0 ; i < size(e); ++i)
{
ll u = find(e[i].u);
ll v = find(e[i].v);
if(u != v)
{
par[v] = u;
++c;
got[i] = true;
mcost += e[i].c;
if(c == num - 1)
break;
}
}
return c;
}
ll omst(ll a)
{
ll i, j, n, p;
ll c = 0;
sort(e.begin(), e.end());
for(i = 0 ; i < size(e); ++i)
{
ll u = find(e[i].u);
ll v = find(e[i].v);
if(u != v && i != a)
{
par[v] = u;
++c;
costs[a] += e[i].c;
if(c == num - 1)
break;
}
}
return c;
}
ll find(ll a)
{
if(par[a]== a)
return(a);
return(par[a] = find(par[a]));
}