标签:
比较复杂 甚入。 我的思路是直接用一个DFS递归回溯做了
关键是题意也比较模糊 注意点如下
1.去的路上可调整,回来不可调整
2.路径最短
3.满足2 且 送出去的车最少
4.满足3 且 拿回来的车最少
AC代码如下
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAX 1000000 4 int C,N,Sp,M; 5 int g[501][501]; 6 int flag[501]; 7 int weight[501]; 8 int path[501]; 9 int path1[501]; 10 int curdis,curbike,cursend; 11 int dis,bike=MAX,mindis=MAX,minsend=MAX; 12 int flag1,k=0; 13 void dfs(int v) 14 { 15 int i,j=1; 16 17 if(dis>mindis) 18 return; 19 path[k]=v; 20 if(v==Sp) 21 { 22 int flag1=0; 23 if(mindis>dis) 24 flag1=1; 25 else if(dis==mindis) 26 { 27 if(cursend<minsend) 28 flag1=1; 29 else if(cursend==minsend) 30 { 31 if(curbike<bike) 32 flag1=1; 33 } 34 } 35 if(flag1) 36 { 37 while(path1[j]!=0) 38 { 39 path1[j]=0; 40 j++; 41 } 42 j=1; 43 while(path[j]!=0) 44 { 45 path1[j]=path[j]; 46 j++; 47 } 48 mindis=dis; 49 minsend=cursend; 50 bike=curbike; 51 } 52 return; 53 } 54 55 flag[v]=1; 56 for(i=1;i<=N;i++) 57 { 58 if(flag[i]!=1&&g[v][i]>0) 59 { 60 dis+=g[v][i]; 61 int lastcurbike=curbike; 62 int lastcursend=cursend; 63 64 if(weight[i]+curbike<C/2) 65 { 66 cursend+=C/2-(weight[i]+curbike); 67 curbike=0; 68 } 69 else 70 curbike=weight[i]+curbike-C/2; 71 k++; 72 path[k]=v; 73 dfs(i); 74 path[k]=0; 75 k--; 76 flag[i]=0; 77 cursend=lastcursend; 78 curbike=lastcurbike; 79 dis-=g[v][i]; 80 81 } 82 } 83 } 84 int main() 85 { 86 int i,j=1,c1,c2,L; 87 scanf("%d%d%d%d",&C,&N,&Sp,&M); 88 for(i=1;i<=N;i++) 89 scanf("%d",&weight[i]); 90 for(i=1;i<=M;i++) 91 { 92 scanf("%d%d%d",&c1,&c2,&L); 93 g[c1][c2]=g[c2][c1]=L; 94 } 95 dfs(0); 96 printf("%d 0",minsend); 97 while(path1[j]!=0) 98 { 99 printf("->%d",path1[j]); 100 j++; 101 } 102 printf(" %d\n",bike); 103 }
标签:
原文地址:http://www.cnblogs.com/threezj/p/4564843.html