先由Floyd求出2点间最短距离,再由任务之间的关系来构图 #include <stdio.h> #include <string.h> #define N 201 #define INF 0x7ffffff bool map[N][N]; int link[N]; bool use[N]; int g[21][21]; struct Job { int city; int st;//start time int d;//time cost }t[N]; int n,q; int min (int a,int b) { return a>b? b:a; } void floyd() { int i,j,k; for (k=1;k<=q;k++) { for(i=1;i<=q;i++) { for (j=1;j<=q;j++) { g[i][j]=min(g[i][j],g[i][k]+g[k][j]); } } } } int search_path(int i) { int v; for (v=1;v<=n;v++) { if (!use[v] && map[i][v]) { use[v]=1; if (link[v]==-1 || search_path(link[v])) { link[v]=i; return 1; } } } return 0; } int max_match() { int sum=0,i; memset(link,-1,sizeof(link)); for (i=1;i<=n;i++) { memset(use,0,sizeof(use)); if (search_path(i)) sum++; } return sum; } int main () { //freopen("3216.txt","r",stdin); int i,j,a,b,sum; int pt;//pretime 前一个工作要的时间 while(scanf("%d%d",&q,&n),q||n) { memset(map,0,sizeof(map)); for (i=1;i<=q;i++) { for (j=1;j<=q;j++) { scanf("%d",&g[i][j]); if (g[i][j]==-1) g[i][j]=INF; } } for (i=1;i<=n;i++) scanf("%d%d%d",&t[i].city,&t[i].st,&t[i].d); floyd(); for (i=1;i<=n;i++) { pt=t[i].st+t[i].d; for (j=1;j<=n;j++) { if (i==j) continue; a=t[i].city; b=t[j].city; if (g[a][b]+pt<=t[j].st) map[i][j]=1; //做完i 还能赶上j 就在i j工作间连上线 } } sum=max_match(); printf("%d/n",n-sum); } }