Pagini recente » Cod sursa (job #1677183) | Cod sursa (job #68931) | Cod sursa (job #1802733) | Cod sursa (job #1503628) | Cod sursa (job #633109)
Cod sursa(job #633109)
#include<stdio.h>
class graph{
public:
int *a,
*b,
*d,
n,
m,
finalDim;
graph(int mc, int nc)
{
a = new int[mc];
b = new int[mc];
d = new int[mc];
n = nc;
m = mc;
finalDim = 0;
}
~graph()
{
delete a;
delete b;
delete d;
}
int grad(int x)
{
int g = 0;
for(int i = 0; i < m; i++)
if(a[i] == x || b[i] == x)
g++;
return g;
}
void deleteNode(int x)
{
int poz1 = 0, poz2 = 0;
for(int i = 0; i < m; i++)
if(poz1 == 0)
{
if(a[i] == x || b[i] == x)
poz1 = i;
}
else
{
if(a[i] == x || b[i] == x)
poz2 = i;
}
if(a[poz1] == x && a[poz2] == x)
a[poz1] = b[poz2];
if(b[poz1] == x && a[poz2] == x)
b[poz1] = b[poz2];
if(b[poz1] == x && b[poz2] ==x)
b[poz1] = a[poz2];
if(a[poz1] == x && b[poz2] == x)
a[poz1] = a[poz2];
d[poz1] += d[poz2];
for(int i = poz2; i< m-1; i++)
{
a[i] = a[i+1];
b[i] = b[i+1];
d[i] = d[i+1];
}
m--;
}
void distance()
{
int min =20000,dis=0;
bool h=true;
while(h)
{
h = false;
int nr = 0;
int sum = 0;
int min = 0;
int auxa = -1,auxb = -1;
bool ok = true;
for(int i= 0; i < m; i++)
{
if(a[i] == b[i] && d[i] != 0 )
{
finalDim += d[i];
d[i]=0;
}
if((a[i] != 0 || b[i] != 0 )&& ok == true)
{
nr++;
sum+=d[i];
min=d[i];
auxa=a[i];
auxb=b[i];
a[i]=b[i]=d[i]=0;
ok=false;
h=true;
}
if(((a[i] == auxa && b[i] == auxb) || (a[i] == auxb && b[i] == auxa))&& ok == false)
{
nr++;
sum+=d[i];
if(d[i] < min) min=d[i];
a[i]=b[i]=d[i]=0;
}
}
if( nr % 2 == 0 && nr != 0) finalDim += sum;
if(nr % 2 == 1 && nr != 0) finalDim += sum+min;
}
}
};
int main()
{
graph *g;
int n,m;
FILE *f=fopen("traseu.in", "r"), *h = fopen("traseu.out","w");
fscanf(f, "%d", &n);
fscanf(f, "%d", &m);
g = new graph(m,n);
for(int i = 0; i < m; i++)
{
fscanf(f, "%d %d %d", &g->a[i], &g->b[i], &g->d[i]);
g->a[i]--;
g->b[i]--;
}
for(int i = 0; i< g->n; i++)
if(g->grad(i) == 2)
{
g->deleteNode(i);
i--;
}
g->distance();
fclose(f);
fprintf(h,"%d", g->finalDim);
fclose(h);
delete g;
return 0;
}