1053. Path of Equal Weight (30)

来源:互联网 发布:淘宝网唯品会 编辑:程序博客网 时间:2024/05/21 17:49

题目地址:http://www.patest.cn/contests/pat-a-practise/1053

考察排序 和 深度搜索(用递归实现),要按照题目的要求输出,刚开始用了队列,没能按找要求输出

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <vector>#include <math.h>#include <string>#include <string.h>#include <queue>#include <unordered_map>#include <algorithm>#include <sstream>using namespace std;#define  N  101int n,m;long long s;struct mydata{    int id;    int weight;    long long dis;    vector<int> children;};mydata v[N];int pre[N];vector<int> ans;bool cmp(int x, int y){    if (v[x].weight > v[y].weight)        return true;    return false;}void func(int num){    int len = v[num].children.size();    if (len == 0)    {        if (v[num].dis == s)        {            ans.push_back(num);        }        return;    }    if (len > 1)        sort(v[num].children.begin(), v[num].children.end(), cmp);    int i;    for (i = 0; i < len; i++)    {        int id = v[num].children[i];        v[id].dis = v[id].weight + v[num].dis;        pre[id] = v[num].id;        func(id);    }}//void func()//{//  int i, j;//  v[0].dis = v[0].weight;//  pre[0] = -1;//  queue<int> que;//  que.push(v[0].id);////  while (!que.empty())//  {//      mydata dtnow = v[que.front()];//      que.pop();//      //      int len = dtnow.children.size();////      if (dtnow.dis == s && len == 0)//      {//          ans.push_back(dtnow.id);//      }////      if (len > 1)//          sort(dtnow.children.begin(), dtnow.children.end(), cmp);////      for (i = 0; i < len; i++)//      {//          int id = dtnow.children[i];//          v[id].dis =v[id].weight + dtnow.dis;//          pre[id] = dtnow.id;//          que.push(id);//      }//  }//  //  int ansLen = ans.size();//  for(i = 0; i < ansLen; i++)//  {//      int no = ans[i];//      vector<int> pp;//      pp.clear();//      while (no != -1)//      {//          pp.push_back(v[no].weight);//          no = pre[no];//      }//      //      int lenn = pp.size();//      printf("%d", pp[lenn-1]);//      for (j = lenn -2 ; j >= 0; j--)//      {//          printf(" %d", pp[j]);//      }//      printf("\n");//  }//  printf("\n");//}int main(){    //freopen("in", "r", stdin);    int i;    scanf("%d%d%ld", &n, &m, &s);    for (i = 0; i < n; i++)    {        scanf("%d", &v[i].weight);        v[i].id = i;    }    int j,id, k, tmp;    for (i = 0; i < m; i++)    {        scanf("%d%d", &id, &k);        for (j = 0; j < k; j++)        {            scanf("%d", &tmp);            v[id].children.push_back(tmp);        }    }    pre[0] = -1;    v[0].dis = v[0].weight;    func(0);    int ansLen = ans.size();    for (i = 0; i < ansLen; i++)    {        int no = ans[i];        vector<int> pp;        pp.clear();        while (no != -1)        {            pp.push_back(v[no].weight);            no = pre[no];        }        int lenn = pp.size();        printf("%d", pp[lenn - 1]);        for (j = lenn - 2; j >= 0; j--)        {            printf(" %d", pp[j]);        }        printf("\n");    }    //printf("");    return 0;}
0 0