标签:mon ica cost 链表 other 记录 pos stream mod
Input The first line of the input is an integer C representing the number of test cases.
For each test case, the first line will contain 6 integers N, M, B, K, R, T, as described above.
(2 <= N <= 100, 0 <= M <= 200, 1 <= B <= 4, 2 <= K <= 5, 0 <= R <= 10 5, 0 <= T <= 200)
The following K lines contain N integers each, indicating the price p ij (0 <= i < K, 1 <= j <= N) for a bag of salt offered by the host of house j in the universe i. The price of house 1 and house N will be marked as -1.(1 <= p ij <= 100)
Then M lines follow, each contains 4 integers a, b, t and m, indicating that there is a road from house a to house b that costs t minutes of time and m yuan of money. (1 <= a,b <= N, a<> b, 1 <= t <=15, 0 <= m <= 100)
Output For each test case, output one line containing “Case #x: y”, where x is the case number (starting from 1) and y is the most money Coach Pang can have if he can have dinner with Uncle Yang on time.
Print "Forever Alone" otherwise.Sample Input
2 3 2 1 2 10 6 -1 1 -1 -1 5 -1 1 2 1 0 2 3 1 1 2 2 1 2 5 5 -1 -1 -1 -1 1 2 10 2 1 2 2 10
Sample Output
Case #1: 17 Case #2: Forever Alone
对于这道题,只是想记录一下自己的代码……
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <vector> 5 #include <set> 6 #include <map> 7 #include <string> 8 #include <cstring> 9 #include <stack> 10 #include <queue> 11 #include <cmath> 12 #include <ctime> 13 #include <utility> 14 using namespace std; 15 #define REP(I,N) for (I=0;I<N;I++) 16 #define rREP(I,N) for (I=N-1;I>=0;I--) 17 #define rep(I,S,N) for (I=S;I<N;I++) 18 #define rrep(I,S,N) for (I=N-1;I>=S;I--) 19 #define FOR(I,S,N) for (I=S;I<=N;I++) 20 #define rFOR(I,S,N) for (I=N;I>=S;I--) 21 typedef unsigned long long ull; 22 typedef long long ll; 23 const int INF=0x3f3f3f3f; 24 const ll INFF=0x3f3f3f3f3f3f3f3fll; 25 const ll M=1e6+3; 26 const ll maxn=1e5+7; 27 const int MAX=5e5+5; 28 const int MAX_N=MAX; 29 const ll MOD=1e6+3; 30 const double eps=0.00000001; 31 ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} 32 template<typename T>inline T abs(T a) {return a>0?a:-a;} 33 inline ll powMM(ll a,ll b){ll ret=1;while (b){if (b&1)ret=ret*a%M;b>>=1;a=a*a%M;}return ret;} 34 int dp[101][202][10][10]; 35 bool vi[101][202][10][10]; 36 int head[205];//链表的起始点 储存从某个点出发的连向其他点的边的链表 37 int edgenum;//边的个数 从0开始 38 int prices[10][105];//盐的价格 39 bool arrival;//能否在T时间内到达n 40 struct edge 41 { 42 int target,t,money; 43 int nxt; 44 }edges[MAX]; 45 void addedge(int now,int to,int time_cost,int money_cost) 46 { 47 edgenum++; 48 edges[edgenum].target=to; 49 edges[edgenum].t=time_cost; 50 edges[edgenum].money=money_cost; 51 edges[edgenum].nxt=head[now]; 52 head[now]=edgenum; 53 // printf("now=%d edgenum=%d\n",now,edgenum); 54 } 55 struct node 56 { 57 int lo,t,k,pack; 58 bool operator <(const node &a)const 59 { 60 return t>a.t; 61 } 62 }; 63 priority_queue<node> que; 64 void init()//初始化函数 65 { 66 memset(head,0xff,sizeof(head));//将链表头初始化为-1 67 memset(vi,false,sizeof(vi)); 68 memset(dp,0,sizeof(dp)); 69 edgenum=-1; 70 arrival=false; 71 while(!que.empty())//清空优先队列 72 que.pop(); 73 } 74 int n,m,b,k,r,T; 75 int solve() 76 { 77 node tem; 78 tem.lo=1;tem.t=0;tem.k=0;tem.pack=0; 79 que.push(tem); 80 vi[1][0][0][0]=true; 81 dp[1][0][0][0]=r; 82 while(!que.empty()) 83 { 84 tem=que.top(); 85 que.pop(); 86 if(tem.t>T||tem.lo==n)continue; 87 // printf("%d! %d\n",tem.lo,head[tem.lo]); 88 for(int i=head[tem.lo];i!=-1;i=edges[i].nxt) 89 { 90 // printf("nxt %d!\n",edges[i].nxt); 91 int new_time,new_money; 92 new_time=tem.t+edges[i].t; 93 new_money=dp[tem.lo][tem.t][tem.k][tem.pack]-edges[i].money; 94 if(new_time>T||new_money<0)continue; 95 if(edges[i].target==n&&tem.k!=0)continue; 96 if(edges[i].target==n)arrival=true; 97 if(tem.lo!=1&&tem.lo!=n)//是可以进行盐买卖的点 98 { 99 //买一包盐 100 if(tem.pack<b&&new_money-prices[tem.k][tem.lo]>dp[edges[i].target][new_time][tem.k][tem.pack+1]) 101 { 102 dp[edges[i].target][new_time][tem.k][tem.pack+1]=new_money-prices[tem.k][tem.lo]; 103 if(!vi[edges[i].target][new_time][tem.k][tem.pack+1]) 104 { 105 vi[edges[i].target][new_time][tem.k][tem.pack+1]=true; 106 node nxt; 107 nxt.k=tem.k;nxt.lo=edges[i].target;nxt.pack=tem.pack+1;nxt.t=new_time; 108 que.push(nxt); 109 } 110 } 111 //卖一包盐 112 if(tem.pack&&new_money+prices[tem.k][tem.lo]>dp[edges[i].target][new_time][tem.k][tem.pack-1]) 113 { 114 dp[edges[i].target][new_time][tem.k][tem.pack-1]=new_money+prices[tem.k][tem.lo]; 115 if(!vi[edges[i].target][new_time][tem.k][tem.pack-1]) 116 { 117 vi[edges[i].target][new_time][tem.k][tem.pack-1]=true; 118 node nxt; 119 nxt.k=tem.k;nxt.lo=edges[i].target;nxt.pack=tem.pack-1;nxt.t=new_time; 120 que.push(nxt); 121 } 122 } 123 } 124 //不买不卖 与无法买卖的情况相同 125 if(new_money>dp[edges[i].target][new_time][tem.k][tem.pack]) 126 { 127 dp[edges[i].target][new_time][tem.k][tem.pack]=new_money; 128 if(!vi[edges[i].target][new_time][tem.k][tem.pack]) 129 { 130 vi[edges[i].target][new_time][tem.k][tem.pack]=true; 131 node nxt; 132 nxt.k=tem.k;nxt.lo=edges[i].target;nxt.pack=tem.pack;nxt.t=new_time; 133 que.push(nxt); 134 } 135 } 136 } 137 //再看看是不是要穿越…… 138 if(tem.lo!=1&&tem.lo!=n) 139 { 140 int new_time=tem.t+1,new_k=(tem.k+1)%k; 141 int new_money=dp[tem.lo][tem.t][tem.k][tem.pack]; 142 if(new_time>T) 143 continue; 144 //买一包盐 145 if(tem.pack<b&&new_money-prices[tem.k][tem.lo]>dp[tem.lo][new_time][new_k][tem.pack+1]) 146 { 147 dp[tem.lo][new_time][new_k][tem.pack+1]=new_money-prices[tem.k][tem.lo]; 148 if(!vi[tem.lo][new_time][new_k][tem.pack+1]) 149 { 150 vi[tem.lo][new_time][new_k][tem.pack+1]=true; 151 node nxt; 152 nxt.k=new_k;nxt.lo=tem.lo;nxt.pack=tem.pack+1;nxt.t=new_time; 153 que.push(nxt); 154 } 155 } 156 //卖一包盐 157 if(tem.pack&&new_money+prices[tem.k][tem.lo]>dp[tem.lo][new_time][new_k][tem.pack-1]) 158 { 159 dp[tem.lo][new_time][new_k][tem.pack-1]=new_money+prices[tem.k][tem.lo]; 160 if(!vi[tem.lo][new_time][new_k][tem.pack-1]) 161 { 162 vi[tem.lo][new_time][new_k][tem.pack-1]=true; 163 node nxt; 164 nxt.k=new_k;nxt.lo=tem.lo;nxt.pack=tem.pack-1;nxt.t=new_time; 165 que.push(nxt); 166 } 167 } 168 //不买不卖 169 if(new_money>dp[tem.lo][new_time][new_k][tem.pack]) 170 { 171 dp[tem.lo][new_time][new_k][tem.pack]=new_money; 172 if(!vi[tem.lo][new_time][new_k][tem.pack]) 173 { 174 vi[tem.lo][new_time][new_k][tem.pack]=true; 175 node nxt; 176 nxt.k=new_k;nxt.lo=tem.lo;nxt.pack=tem.pack;nxt.t=new_time; 177 que.push(nxt); 178 } 179 } 180 } 181 } 182 if(!arrival) 183 return -1; 184 else 185 { 186 int an=0; 187 for(int i=0;i<=T;i++) 188 for(int j=0;j<=b;j++) 189 an=max(an,dp[n][i][0][j]); 190 return an; 191 } 192 } 193 int main() 194 { 195 int c; 196 scanf("%d",&c); 197 for(int Case=1;Case<=c;Case++) 198 { 199 init(); 200 scanf("%d%d%d%d%d%d",&n,&m,&b,&k,&r,&T); 201 for(int i=0;i<k;i++) 202 for(int j=1;j<=n;j++) 203 scanf("%d",&prices[i][j]);//读入价格 204 for(int i=1;i<=m;i++) 205 { 206 int a,b,t,m; 207 scanf("%d%d%d%d",&a,&b,&t,&m); 208 addedge(a,b,t,m); 209 } 210 int an=solve(); 211 if(an==-1) 212 printf("Case #%d: Forever Alone\n",Case); 213 else 214 printf("Case #%d: %d\n",Case,an); 215 } 216 return 0; 217 }
(BFS)HDU 4784 Dinner Coming Soon
标签:mon ica cost 链表 other 记录 pos stream mod
原文地址:http://www.cnblogs.com/quintessence/p/7276946.html