Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9118 | Accepted: 3383 |
Description
Input
Output
Sample Input
5 6 7 1 2 2 3 2 4 3 3 3 4 2 4 1 3 4 1 4 6 2 1 3 5 2 0 5 4 3 2
Sample Output
11
Source
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #define N1 101 #define N2 10001 #define INF 0x7ffffff using namespace std; bool inque[N1][N2]; int sum[N1][N2]; class num { public: int id,take; num(int l,int r):id(l),take(r){} }; struct link { int e,take,len,next; }a[N2]; int b[N1],k,n,m,Top; int main() { //freopen("data1.in","r",stdin); void addeage(int s,int d,int l,int t); int spfa(); while(scanf("%d %d %d",&k,&n,&m)!=EOF) { Top = 0; memset(b,-1,sizeof(b)); for(int i=0;i<=m-1;i++) { int s,d,l,t; scanf("%d %d %d %d",&s,&d,&l,&t); addeage(s,d,l,t); } int t=spfa(); printf("%d\n",t); } return 0; } void addeage(int s,int d,int l,int t) { a[Top].e = d; a[Top].len = l; a[Top].take = t; a[Top].next = b[s]; b[s] = Top; Top++; } int spfa() { memset(inque,false,sizeof(inque)); for(int i = 1;i <= n; i++) { for(int j=0; j <= k; j++) { sum[i][j] = INF; } } queue<num> que; que.push(num(1,0)); inque[1][0] = true; sum[1][0] = 0; while(!que.empty()) { num tag = que.front(); int id1 = tag.id; int take1 = tag.take; que.pop(); inque[id1][take1] = false; for(int i = b[id1]; i!=-1; i=a[i].next) { int id2 = a[i].e; int len2 = a[i].len; int take2 = a[i].take; if(take1+take2<=k&&sum[id2][take1+take2]>sum[id1][take1]+len2) { sum[id2][take1+take2]=sum[id1][take1]+len2; if(!inque[id2][take1+take2]) { que.push(num(id2,take1+take2)); inque[id2][take1+take2] = true; } } } } int Min = INF; for(int i=0;i<=k;i++) { Min = min(sum[n][i],Min); } if(Min==INF) { return -1; } return Min; }