基德KID.1412 发表于 2013-1-26 12:35:13

【floyd/要防重边】HDU 2923 Einbahnstrasse

http://acm.hdu.edu.cn/showproblem.php?pid=2923

一开始题意理解错了……英语太水了
要从公司开始按所给顺序把车拉回来,是一辆一辆车拖回来……这是常识……我竟然想着最后一堆车拖回来
http://dl.iteye.com/upload/attachment/537526/9e966ac9-fafa-34de-ba6a-6ddbf73378dc.jpg

Sample Input
4 2 5
NewTroy Midvale Metrodale
NewTroy   <-20-> Midvale
Midvale   --50-> Bakerline
NewTroy    <-5-- Bakerline
Metrodale <-30-> NewTroy
Metrodale--5-> Bakerline
0 0 0

Sample Output
1. 80

#include <iostream>#include <fstream>#include <algorithm>#include <string>#include <set>#include <map>#include <queue>#include <utility>#include <stack>#include <list>#include <vector>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>//#include <ctime>#include <ctype.h>using namespace std;#define inf 0x3fffffff#define M 1005map<string, int> m;int n, dist, ind;void init (){    m.clear();    int i, j;    for (i = 1; i <= n; i++)      for (j = i + 1; j <= n; j++)            dist = dist = inf;}void floyd (){    int i, j, k;    for (k = 1; k <= n; k++)      for (i = 1; i <= n; i++)            for (j = 1; j <= n; j++)                if (dist + dist < dist)                  dist = dist + dist;}int main(){    int c, r, i, key, w, res, cc = 1, len, k, j, u, v;    bool flag, mark;    char s1, s2, s, tp;    while (scanf ("%d%d%d", &n, &c, &r), (n||c||r))    {      key = 1;      init ();      for (i = 0; i <= c; i++)      {            scanf ("%s", s);            string p(s);            if (m == 0)                m = key++;    //将字符串p映射为key【编号】            ind = m;      }      for (i = 0; i < r; i++)      {            flag = mark = false;            scanf ("%s%s%s", s1, s, s2);            string p1(s1);            if (m == 0)                m = key++;            u = m;            string p2(s2);            if (m == 0)                m = key++;            v = m;            len = strlen(s);            k = 0;            for (j = 0; j < len; j++)            {                if (s == '<') flag = true;                if (s == '>') mark = true;                if (s >= '0' && s <= '9')                  tp = s;    //tp读取箭头中间的数字            }            tp = 0;            sscanf (tp, "%d", &w);    //tp转化成int存放到w            if (flag && w < dist) dist = w;            if (mark && w < dist) dist = w;//记得判断重边【w < dist】,wa了无数次      }      floyd();      res = 0;      for (i = 1; i <= c; i++)            res += (dist] + dist]);//先从1去那里,再把车拉回1,根据题意,是按顺序一个一个拖回来      printf ("%d. %d\n", cc++, res);    }    return 0;}
页: [1]
查看完整版本: 【floyd/要防重边】HDU 2923 Einbahnstrasse