Cod sursa(job #115231)

Utilizator blasterzMircea Dima blasterz Data 16 decembrie 2007 11:46:10
Problema Gather Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasele 11-12 Marime 2.52 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <queue>
#define maxn 751
#define pb push_back

struct nod { int n, c, ppl; nod(){}; nod(int a, int b, int cc){n=a; c=b; ppl=cc;};};

vector<nod> a[maxn];

int dp[maxn*10][maxn][16];
int ppl[16];
int K, n, m;
int used[16];
bool USE[maxn];
inline int min(int a, int b)
{
  if(a<b) return a;
  return b;
}


void read()
{
  freopen("gather.in","r",stdin);
  scanf("%d %d %d\n", &K, &n, &m);

  int i, p, q, c, mx, t;
  for(i=1;i<=K;++i){ scanf("%d\n", &t); ppl[t]=1;}
  while(m--)
    {
      scanf("%d %d %d %d\n", &p, &q, &c, &mx);
      a[p].pb(nod(q, c, mx));
      a[q].pb(nod(p, c, mx));
    }
}


int memo(int t, int i, int j)
{
   if(t>maxn) return 0;
  if(dp[t][i][j]) return dp[t][i][j];

  if(j==K) return 0;

  vector<nod>::iterator it;
  dp[t][i][j]=0x3f3f3f3f;
  for(it=a[i].begin();it!=a[i].end();++it)
    {
      dp[t][i][j]=min(dp[t][i][j],  memo(t+1, it->n, j)+(j+1)*it->c);
      if(ppl[i])
	{
	  used[i]=1;
	  dp[t][i][j]=min(dp[t][i][j], memo(t+1, it->n, j+1)+(j+1)*it->c);
	  dp[t][i][j]=min(dp[t][i][j], memo(t+1, it->n, j) + (j+1)*it->c);
	  used[i]=0;
	}
    }

  return dp[t][i][j];
}
      




void solve()
{
  int i, j, k, t, ok;
  vector<nod>::iterator it;
  queue<int>Q;

  dp[1][1][0]=0;
  dp[1][1][1]=0;
  USE[1]=1;

  for(t=2;t<=n;++t)
    for(i=1;i<=n;++i)
      for(j=0;j<=K;++j)
	{
	  dp[t][i][j]=0x3f3f3f3f;
	  for(it=a[i].begin();it!=a[i].end();++it)
	    {
	      if(ppl[it->n] && !used[it->n] && USE[it->n])
		{
		  if(j+1<=it->ppl)
		    {
		      ok=0;
		      if(dp[t][i][j]>dp[t-1][it->n][j-1])
			{
			  dp[t][i][j]=dp[t-1][it->n][j-1];
			  ++used[it->n];
			  ok=1;
			}
		      
		      if(dp[t][i][j] > dp[t-1][it->n][j])
			{
			  if(ok) --used[it->n];
			  dp[t][i][j]=dp[t-1][it->n][j-1];
			}
		      
		      /*
		      if(dp[t-1][it->n][j]>dp[t-1][it->n][j-1]) 
			{
			  dp[t][i][j]=dp[t-1][it->n][j-1];
			  used[it->n]=1;
			}
		      else
			dp[t][i][j]=dp[t-1][it->n][j-1];
		      */
		      ///		  dp[i][j]=min(dp[it->n][j]+(j+1)*it->c, dp[it->n][j-1]+(j+1)*i->c);
		    }
		  
		}
	      if(!ppl[it->n]) dp[t][i][j]=min(dp[t][i][j],dp[t-1][it->n][j]);
	      dp[t][i][j]+=(j+1)*it->c;
	      USE[i]=1;
	    }
	}
  
  int sol=0x3f3f3f3f;
  for(t=2;t<=n;++t)
    for(i=1;i<=n;++i)
      //      for(j=1;j<=K;++j)
	if(dp[t][i][K]!=0) sol=min(sol, dp[t][i][K]);

  printf("%d\n", sol);
 
  printf("%d %d\n", dp[2][2][0], dp[2][2][1]);
}

int main()
{
  read();
  //  solve();
  freopen("gather.out","w",stdout);
  printf("%d\n", memo(1,1,0)); 



  return 0;
}