T1 工作依赖
- 题目描述(Description)
2008年,奥运会将在中国举行。众所周知举办奥运会是一个庞大的工程,有许多准备工作要做,而这些工作也是要分先后、存在依赖关系的。比如我们说工作2依赖于工作1,意思是说在工作2开始做之前要必须结束工作1。我们假设,在一个时刻只有一个工作在进行,而且每样工作所依赖的其它工作不会超过10个。
- 输入文件(job.in):
第一行有两个整数N(0<=N<=10000)和M。所有工作从1到N编号。你需要计算第M个工作的最早结束时间。
接下来N行每行描述一个工作,第1行描述工作1,第二行描述工作2,……,以此类推。每行包含几个正整数,第i行的第1个整数是完成第i个工作需要的时间T(0<T<=100),第i行的其余数字是第i个工作所依赖的其它工作编号。我们保证不会出现循环依赖。
- 输出文件(job.out):
一个整数:工作M的最早结束时间。
- 样例(Sample):
Sample Input Case 1:
2 2
3
2 1
Sample Output Case 1:
5
Sample Input Case 2:
3 3
3
2 1
4 1 2
Sample Output Case 2:
9
我的零分代码 (我不知道把零分代码贴上来干什么)
1 /* 2 id:gww 3 language: 4 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 5 */ 6 #include<bits/stdc++.h> 7 using namespace std; 8 const int N=10000+5; 9 const int inf=0x3f3f3f3f; 10 int n,m,ti[N],dep[N][12],c[N],f[N][12]; 11 bool vis[N][12]; 12 int read() 13 { 14 int x=0,w=0;char ch=0; 15 while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} 16 while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 17 return w?-x:x; 18 } 19 20 void dp(int u,int gs) 21 { 22 if(gs==c[u]) return; 23 for(int i=1;i<=c[u];i++) 24 { 25 int v=dep[u][i]; 26 if(vis[u][i]==1) continue; 27 if(f[u][gs+1]>(f[u][gs]+ti[v])) 28 { 29 f[u][gs+1]=f[u][gs]+ti[v]; 30 vis[u][i]=1; 31 dp(u,gs+1); 32 } 33 } 34 } 35 36 void clean() 37 { 38 memset(dep,0,sizeof(dep)); 39 memset(c,0,sizeof(c)); 40 memset(f,inf,sizeof(f)); 41 memset(vis,0,sizeof(vis)); 42 } 43 44 int main() 45 { 46 n=read(),m=read(); 47 clean(); 48 char a[210]; 49 for(int i=1;i<=n;i++) 50 { 51 memset(a,0,sizeof(a)); 52 gets(a); 53 int la=strlen(a),cnt=0; 54 ti[i]=a[0]-'0'; 55 for(int j=1;j<=la;j++) 56 if(a[j]>='0'&&a[j]<='9') 57 dep[i][++cnt]=a[j]-'0'; 58 } 59 for(int i=1;i<=n;i++) 60 if(dep[i][1]!=0) 61 for(int j=1;j<=10;j++) 62 if(dep[i][j]!=0) 63 c[i]++; 64 for(int i=1;i<=n;i++)//初始化 65 f[i][0]=ti[i]; 66 dp(m,0); 67 printf("%d",f[m][c[m]]); 68 return 0; 69 }