Cod sursa(job #5574)

Utilizator AlxCojocaru Alexandru Alx Data 13 ianuarie 2007 12:02:46
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#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--;
 }
}
void 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]]);
}