Pagini recente » Cod sursa (job #2949236) | Cod sursa (job #779412) | Cod sursa (job #1744324) | Cod sursa (job #685684) | Cod sursa (job #109128)
Cod sursa(job #109128)
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define INF 0x7f7f7f7f
#define maxN 70
#define maxK 400
int n,m,gs,res,mat[maxN][maxN],gr[maxN];
int k,l,dis[maxK][maxK],dis2[maxK][maxK];
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--;
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 roy(int n,int(*mat)[maxK]){
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!=INF && b!=INF && (c==INF || a+b<c))c=a+b;
}
mat[i][j]=c;
}
}
void bellman(){
queue<int> qu;
int d[maxK],lst[maxK]={};
memset(d,0x7f,sizeof d);
d[0]=0;
qu.push(0);
while(!qu.empty()){
int c=qu.front(); qu.pop();
for(int i=0;i<=l;i++)if(dis[c][i]!=INF){
int urm=d[c]+dis[c][i];
if(urm<d[i]){
d[i]=urm,lst[i]=c,qu.push(i);
}
}
}
for(int i=0;i<=l;i++)for(int j=0;j<=l;j++)dis2[i][j]=dis[i][j];
roy(l+1,dis2);roy(l+1,dis2);
if(dis2[0][l]!=d[l])throw 0;
int i=l;
while(i){
int a=lst[i],b=i;
dis[b][a]=-dis[a][b];
dis[a][b]=INF;
i=a;
}
res+=d[l];
}
int main(){
inputFunc();
roy();roy();
for(int i=0;i<n;i++)if(gr[i]>0)k+=gr[i];
l=2*k+1;
memset(dis,0x7f,sizeof dis);
int ik=1;
for(int i=0;i<n;i++){
int c=-gr[i]+1;
while(c--,c>0){
int jk=k+1;
for(int j=0;j<n;j++){
int c2=gr[j]+1;
while(c2--,c2>0){
dis[ik][jk]=mat[i][j];
dis[jk++][l]=0;
}
}
dis[0][ik++]=0;
}
}
for(int i=0;i<k;i++){
bellman();
}
res+=gs;
outputFunc();
return 0;
}