Pagini recente » Cod sursa (job #2014690) | Cod sursa (job #831756) | Arhiva de probleme | Cod sursa (job #2076049) | Cod sursa (job #5576)
Cod sursa(job #5576)
#include <stdio.h>
using namespace std;
int (*a)[200]=new int[10001][200],(*c)[500]=new int[500][500],*viz=new int[10001],*con=new int[10001],n,(*crt)[500][2]=new int[500][500][2],nrcrt,nrc,(*qwe)[2]=new int[500][2];
long mina;
void dfs(int x,int nr)
{
for (int i=1;i<=n;i++)
if (!viz[i]&&a[x][i])
{
viz[i]=1;
con[i]=nr;
dfs(i,nr);
}
}
void krus(int nr)
{
int i,j,nr2=nr,min,minx,miny;
while (nr2>1)
{
min=30000;
for (i=1;i<=nr;i++)
for (j=1;j<=nr;j++)
if (c[i][j]>0&&c[i][j]<min)
{
min=c[i][j];
minx=i;
miny=j;
}
mina+=min;
qwe[nrcrt][0]=minx;
qwe[nrcrt][1]=miny;
nrcrt++;
c[minx][miny]=c[miny][minx]=-c[minx][miny];
nr2--;
}
}
int main()
{
freopen("flood.in","r",stdin);
freopen("flood.out","w",stdout);
int i,m,p,x,y,z;
scanf("%d\n%d\n",&n,&m);
for (i=0;i<m;i++)
{
scanf("%d %d\n",&x,&y);
a[x][y]=a[y][x]=1;
}
scanf("%d\n",&p);
viz[1]=0;
for (i=1,nrc=0;i<=n;i++)
if (!viz[i])
{
nrc++;
con[i]=nrc;
viz[i]=1;
dfs(i,nrc);
}
printf("%d\n",(nrc-1));
for (i=0;i<p;i++)
{
scanf("%d %d %d\n",&x,&y,&z);
if (con[x]!=con[y]&&(c[con[x]][con[y]]>z||c[con[x]][con[y]]==0))
{
c[con[x]][con[y]]=c[con[y]][con[x]]=z;
crt[con[x]][con[y]][0]=x;
crt[con[x]][con[y]][1]=y;
}
}
for (i=1;i<=n;i++)
viz[i]=0;
krus(nrc);
printf("%d\n",mina);
for (i=0;i<nrcrt;i++)
printf("%d %d %d\n",crt[qwe[i][0]][qwe[i][1]][0],crt[qwe[i][0]][qwe[i][1]][1],-c[qwe[i][0]][qwe[i][1]]);
return 0;
}