比赛描述
大飞机指起飞总重超过100吨的运输类飞机,包括军用大型运输机和民用大型运输机,也包括一次航程达到3000公里的军用或100座位以上的民用客机。国际航运体系习惯上把300座位以上的客机称作“大型客机”,在我国,一般把150座以上客机称为“大型客机”。
随着民用航空快速发展和国防现代化步伐加快,中国对大型飞机的需求日益紧迫。自主研制大型飞机,发展有市场竞争力的航空产业,对于转变经济增长方式、带动科学技术发展、增强国家综合实力和国际竞争力,加快现代化步伐,具有重大意义。中国航空工业经过多年的发展,已经具备发展大型飞机的技术和物质基础。2007年2月,国务院原则批准大型飞机研制重大科技专项正式立项。
但自主制造大飞机非常复杂,需要在全球范围内配置部件,联合多个公司通力合作才能完成。假设从开始制造到完成一架飞机中间需要完成n个部件,这些部件可能由多个公司协作完成有关部分(称为一道工序),当然每道工序所耗费的时间可能是不同的。现请你根据给定数据,确定哪些工序是关键的,不能提早,也不能拖延。
输入
第一行是一个正整数:测试用例数目,最多为100。之后,每个测试用例包括多行:
l 第1行给出两个整数(空格分隔),第一个整数表示部件数n,2≤n≤200,第二个整数表示工序数m,0≤m≤20100。
l m行,每行三个整数(空格分隔),前两个整数表示两个部件;第三个整数表示涉及上述两个部件的工序需要花费的时间t,部件用序号表示,分别为1,…,n,这里假设飞机制造启动用0号序号表示,飞机制造完成用n+1号序号表示;一道工序用前后的部件表示,例如,如果1和2部件之间存在一道工序,则这道工序表示为(1,2)
输出
对于每个测试用例:
l 按照制造顺序给出关键工序
注意:(1)每个测试用例关键工序之间没有空格;
(2)输出部分的结尾要求包含一个多余的空行。
(3)(4,5)和(4,7)均为关键工序时,先输出(4,7),再输出(4,5)
样例输入
2
1 2
0 1 1
1 2 2
2 4
0 1 2
1 2 3
2 3 5
0 3 18
样例输出
(0,1)(1,2)
(0,3)
题目来源
算法与数据结构设计考核赛2009
#include<iostream> #define N 202 int main(){ int T,n,m,i,j,t,a[N][N],earlist[N],latest[N],prev[N],next[N],temp; bool visited[N]; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); n += 2; for(i=0;i<n;i++){ for(j=0;j<n;j++){ a[i][j]=0; } prev[i]=0; next[i]=0; earlist[i]=0; visited[i]=0; latest[i]=INT_MAX; } while(m--){ scanf("%d%d%d",&i,&j,&t); a[i][j]=t; prev[j]++; next[i]++; } i=0; earlist[0]=0; visited[0]=1; while(i<n){ for(j=0;j<n;j++){ if(a[i][j]){ prev[j]--; temp= earlist[i]+a[i][j]; if(temp>earlist[j]){ earlist[j]=temp; //最早开始时间,算最小的 } } } for(i=0;i<n;i++){ if(!visited[i] && 0==prev[i]){ visited[i]=1; break; } } } for(i=0;i<n;i++){ visited[i] = 0; } j=n-1; latest[0]=0; latest[j]=earlist[j]; visited[j]=1; while(j>0){ for(i=n-2;i>0;i--){ if(a[i][j]){ next[i]--; temp = latest[j]-a[i][j]; if(latest[i]>temp){ latest[i]=temp; //最晚开始时间,记录最小的 } } } for(j=n-2;j>0;j--){ if(!visited[j] && 0==next[j]){ visited[j]=1; break; } } } t=0; //t记录关键点个数,就存在prev好了 for(i=0;i<n;i++){ if(earlist[i]==latest[i]){ prev[t++]=i; } } for(i=0;i<t;i++){ for(j=t-1;j>i;j--){ if(earlist[prev[i]]+a[prev[i]][prev[j]]==earlist[prev[j]]){ printf("(%d,%d)",prev[i],prev[j]); } } } printf("\n"); } }