算法导论--装备线调度(升序&&降序输出)

来源:互联网 发布:tt域名cc域名 编辑:程序博客网 时间:2024/05/22 02:11
题意就先不用讲了吧,感觉自己还没有掌握核心的东西。
//心得//怎样保持路径,递归的实现#include<iostream>#include<cstdio>#include<vector>#include<stack>#include<cstring>using namespace std;int a[100][100];//time for stationint t[100][100];//time for from Li to Lj int f[100][100];//recorded timeint l[100][100];//keep trace of fastest ways,比如l[1][6]==2,说明l[1][6]是从//lines 2过来的int e[2];//into timeint ss[100];int x[2];//depart timeint last_time;/*******test data*********167 9 3 4 8 48 5 6 4 5 72 3 1 3 42 1 2 2 12 43 2*************************//********core code******/int assmbly_line(int m){int ff;f[1][1]=e[1]+a[1][1];f[2][1]=e[2]+a[2][1];//开始时比较进入哪一条装配线//printf("\n%d %d",f[1][1],f[2][1]);for(int j=2;j<=m;j++){//最优化选择if(f[1][j-1]+a[1][j]<=f[2][j-1]+a[1][j]+t[2][j-1]){f[1][j]=f[1][j-1]+a[1][j];l[1][j]=1;//printf("j=%d 1\t",l[1][j]);}else{f[1][j]=f[2][j-1]+a[1][j]+t[2][j-1];l[1][j]=2;//printf("j=%d 2\t",l[2][j]);}if(f[2][j-1]+a[2][j]<=f[1][j-1]+t[1][j-1]+a[2][j]){f[2][j]=f[2][j-1]+a[2][j];l[2][j]=2;//printf("j=%d 2\t",l[2][j]);}else{f[2][j]=f[1][j-1]+t[1][j-1]+a[2][j];l[2][j]=1;//printf("j=%d 1\t",l[2][j]);}}if(f[1][m]+x[1]<=f[2][m]+x[2]){int i=1;ff=f[1][m]+x[1];last_time=1;}else{ff=f[2][m]+x[2];last_time=2;}return ff;}//打印路径降序 void print_lines(int s[100],int ll,int m){int i=ll;ss[m]=i;//为了后面的升序使用printf("lines: %d,stations: %d\n",i,m);for(int j=m;j>=2;j--){i=l[i][j];printf("lines: %d,stations: %d\n",i,j-1);ss[j-1]=i;}}//打印路径升序递归 void print_cursion_line( int l[][100],int last_l,int n){int i=last_l;if(n==1)printf("Lines %d,stations %d\n",i,n);else{print_cursion_line(l,l[i][n],n-1);printf("Lines %d,stations %d\n",i,n);}}//打印路径非递归 void nocursion_increasing(int ss[100],int m){for(int i=1;i<=m;i++)printf("lines %d,stations %d\n",ss[i],i);}//*******core code******//int main(){int m;freopen("in.txt","r",stdin);int k;scanf("%d",&k);//测试的数据块数while(k--){memset(a,0,sizeof(a));memset(t,0,sizeof(t));memset(f,0,sizeof(f));memset(l,0,sizeof(l));memset(e,0,sizeof(e));memset(x,0,sizeof(x));scanf("%d",&m);//装配站的数目for(int i=1;i<=m;i++)scanf("%d",&a[1][i]);for(int i=1;i<=m;i++)scanf("%d",&a[2][i]);for(int i=1;i<m;i++)scanf("%d",&t[1][i]);for(int i=1;i<m;i++)scanf("%d",&t[2][i]);for(int i=1;i<=2;i++)scanf("%d",&e[i]);for(int i=1;i<=2;i++)scanf("%d",&x[i]);}printf("\n");int cai=assmbly_line(m);printf("The total cast time is %d\n",cai);                int ll=last_time;                //以下是打印的路径                printf("decreaing output is \n");print_lines(l[m],ll,m);printf("Increaing and oncursion output is \n");nocursion_increasing(ss,m);printf("increaing cursion is \n");print_cursion_line(l,ll,m);//printf("last_time=%d\n",last_time);}


0 0
原创粉丝点击