第七届 山东ACM热身赛 Dwarf Tower



#include <iostream>
#include <vector>
#include <cstring>
#include <stdio.h>
using namespace std;

struct Com{
  int  x,y;
  Com(int _x,int _y){
    x=_x;
    y=_y;
  }
};
vector <Com> vec[10005];
int value[10005];
int minvalue[10005];

int dfs(int x){
 //cout<<"========"<<x<<' '<<minvalue[x]<<endl;
 if(minvalue[x]!=-1)
    return minvalue[x];
 minvalue[x] = value[x];
 for(int i=0 ; i<vec[x].size();i++){
    int tmpx,tmpy;
    if(minvalue[ vec[x][i].x ]!=-1 )
        tmpx=minvalue[ vec[x][i].x ];
    else
        minvalue[ vec[x][i].x ] = dfs(vec[x][i].x) , tmpx = minvalue[ vec[x][i].x ];
    if(minvalue[ vec[x][i].y ]!=-1 )
        tmpy=minvalue[ vec[x][i].y ];
    else
        minvalue[ vec[x][i].y ] = dfs(vec[x][i].y) , tmpy = minvalue[ vec[x][i].y ];
    minvalue[x] = min(minvalue[x] , tmpx+tmpy);
 }
 //cout<<x<<":"<<minvalue[x]<<endl;
 return minvalue[x];
}


int main()
{
    int m,n;
    int tmp,x,y;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&value[i]);
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&tmp,&x,&y);
        vec[tmp].push_back(Com(x,y));
    }
   //cout<<vec[1][0].x<<' '<<vec[1][0].y<<' '<<endl;
   // cout<<vec[4][0].x<<' '<<vec[4][0].y<<' '<<endl;
   // cout<<vec[5][0].x<<' '<<vec[5][0].y<<' '<<endl;
    memset(minvalue,-1,sizeof(minvalue));
    printf("%d",dfs(1));
    return 0;
}





原文地址:https://www.cnblogs.com/zswbky/p/6717913.html