Pagini recente » Cod sursa (job #1863048) | Cod sursa (job #724914) | Cod sursa (job #2806331) | Cod sursa (job #1297750) | Cod sursa (job #108976)
Cod sursa(job #108976)
#include <stdio.h>
#include <string.h>
#define maxN 70
struct nd{int v;nd*u;nd(){}nd(int pv,nd*pu){v=pv,u=pu;}};
int n,m,res,mat[maxN][maxN],gr[maxN];
nd*lvec[maxN];
int k,l,dis[maxN][maxN],comp[maxN],wei[maxN],who[maxN];
int st[maxN],sum,gs;
void inputFunc(){
FILE*fi=fopen("traseu.in","r");
fscanf(fi,"%d %d",&n,&m);
for(int i=0;i<m;i++){
int a,b,c;
fscanf(fi,"%d %d %d",&a,&b,&c);a--,b--;
lvec[a]=new nd(b,lvec[a]);
mat[a][b]=c;gs+=c;
gr[a]++,gr[b]--;
}
fclose(fi);
}
void outputFunc(){FILE*fi=fopen("traseu.out","w");fprintf(fi,"%d",res);fclose(fi);}
void roy(){
for(int i=0;i<n;i++)for(int j=0;j<n;j++){
int c=mat[i][j];
for(int k=0;k<n;k++){
int a=mat[i][k],b=mat[k][j];
if(a && b && (!c || a+b<c))c=a+b;
}
mat[i][j]=c;
}
}
void back(int lvl){
if(lvl==k){
if(res>sum)res=sum;return;
}
int&i=st[lvl];
if(!lvl)i=0;else{
if(comp[lvl-1]==comp[lvl])i=st[lvl-1];else i=0;
}
for(;i<l;i++)if(wei[i]){
wei[i]--;sum+=dis[lvl][i];
back(lvl+1);
wei[i]++;sum-=dis[lvl][i];
}
}
int main(){
inputFunc(); res=999999999;
roy();roy();
for(int i=0;i<n;i++)if(gr[i]<0){
who[l]=i;wei[l++]=-gr[i];
}
for(int i=0;i<n;i++){
int c=gr[i]+1;
while(c--,c>0){
for(int j=0;j<l;j++){
dis[k][j]=mat[who[j]][i];
}
comp[k++]=i;
}
}
back(0);
res+=gs;
outputFunc();
return 0;
}