1010

题意:有一条A到B的路,而B到家的最短路比A到家的最短路要小,那么就可以从A到B,B到家,这可以算作一条路可走。求共有多少条这样的路从1点到家

思路:先算出每个点到点2的最短路算出来,然后用深搜+标记,减少时间,算出共有多少条路可走到家。

代码:

#include<iostream>
#include<queue>
using namespace std;

typedef struct n1
{
    int  distens,flog;
}node;
node N[1005];
int map[1005][1005],k;
int direct[1005];
void set(int n)
{
    int i,j,m,n1,n2,d;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            map[i][j]=-1;
        }
         N[i].distens=10000000;N[i].flog=0;direct[i]=0;
    }

    scanf("%d",&m);
    while(m--)
    {
        scanf("%d%d%d",&n1,&n2,&d);
        if(map[n1][n2]!=0||map[n1][n2]>d)
        map[n1][n2]=map[n2][n1]=d;
    }
}
void spfa(int n)
{
    queue<int> Q;
    int now;
    int i;
     N[2].distens=0;N[2].flog=1;
    Q.push(2);
    while(!Q.empty())
    {
        now=Q.front();
        Q.pop();
        N[now].flog=0;
        //if(q.x==1)break;
        for(i=1;i<=n;i++)
        if(map[now][i]!=-1)
        {
            if(N[i].distens>N[now].distens+map[now][i])
            {
                N[i].distens=N[now].distens+map[now][i];
                if(N[i].flog==0)
                {
                    N[i].flog=1;
                    Q.push(i);
                }
            }
        }
    }
}
int DFS(int now,int n)
{
    int i;
    if(direct[now]>0)
    return direct[now];
    if(now==2)
    {
        return 1;
    }
    for(i=1;i<=n;i++)
    if(map[now][i]!=-1&&N[now].distens>N[i].distens)
    {
        direct[now]+=DFS(i,n);
    }

   return direct[now];
}
int main()
{
    int n;
    while(scanf("%d",&n)>0&&n)
    {
        set(n);
        spfa(n);
        k=DFS(1,n);
        printf("%d\n",k);
    }
}
时间: 2024-12-28 21:55:20

1010的相关文章

LightOJ 1010 Knights in Chessboard (规律)

题意:给定一个m*n的棋盘,问最多放多少个马,使得他们不相互攻击. 析:很明显可以从上图看出来了马放在白格,或者黑格,不会攻击,不过行或者列为1,2时是特殊的,我们只要特殊判断一下就行了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cm

1010 求个最大值

1010: 求个最大值 时间限制: 1 Sec  内存限制: 128 MB提交: 231  解决: 39[提交][状态][讨论版] 题目描述 给出 n(1 <= n <= 200000)个数字 ai(1 <= ai <= 1000000),i 为数字的下标,按输入顺序从 1 开始编号一直到 n,求满足 ai >= aj 的最大的 ai % aj. 输入 第一行一个数字 n,第二行 n 个整数. 输出 题目要求的最大值. 样例输入 2 2 3 样例输出 1 提示

BZOJ - 1010【斜率优化DP】

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9961  Solved: 4056[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过 压缩后变成一维长度为Ci.为了方便整理

BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

NBUT 1010 魔法少女(DP)

[1010] 魔法少女 时间限制: 1000 ms 内存限制: 65535 K 问题描述 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙. 因为魔女之夜是悬浮在半空的,所以她必须要爬楼,而那座废墟一共有n层,而且每层高度不同,这造成小炎爬每层的时间也不同.不过当然,小炎会时间魔法,可以瞬间飞过一层或者两层[即不耗时].但每次瞬移的时候她都必须要至少往上再爬一层(在这个当儿补充魔力)才能再次使用瞬移.爬每单位高度需要消耗小炎1秒时间.

Entity Framework 6 Recipes 2nd Edition(10-10)译 - &gt; 为TPH继承的插入、更新、删除操作映射到存储过程

10-10. 为TPH继承的插入.更新.删除操作映射到存储过程 问题 TPH继承模型,想把它的插入.修改.删除操作映射到存储过程 Solution 假设数据库有一个描述不同种类的产品表(Product )(见Figure 10-13). 而且为这个表的每种产品创建了创建了派生模型,这个模型如Figure 10-14. Figure 10-13. 一个含有鉴别列(ProductType)的产品表, 表的每行按该列的值划分不同的产品 Figure 10-14. TPH继承形式的模型 接下来把这个模型

BZOJ 1010 玩具装箱 斜率优化DP

详情见 http://www.cnblogs.com/proverbs/archive/2013/02/01/2713109.html(我觉得这里面讲得已经够详细了,我就不赘述了) 还是来回忆一下做这道题的历程吧!一开始的确有点想错了,但马上又反应过来,清楚了题意.写了个 n^2 的算法.很明显,对于n <=  50000 的数据,肯定是要TLE的.(援引我看博客过程中看到的一句话来形容就是“省选题的数据就是硬”.)没办法,只能上网找百度(太弱了).一开始的确有点茫然,但马上就决定要自己推导一下

BZOJ 1010 [HNOI2008]玩具装箱toy

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7184  Solved: 2724[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

题目1010:A + B

题目描述: 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入: 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出. 输出: 对每个测试用例输出1行,即A+B的值. 样例输入: one + two = three four + five six = zero seven + eight nine = zero + zero = 样例

bzoj 1010 斜率优化DP

我的第二道斜率DP. 收获: 1.假设两个位置:p<q<i,然后让某一位置优,看其满足什么性质,所谓斜率优化就是满足: (g[q]-g[p])/(f[q]-f[p])  op h[i] 要化简成这样,必须满足f函数关于位置单调,否则op(<或>)的方向就会因为f的大小关系而变化,就没有凸的性质了. 2.斜率优化很难调试,所以当发现暴力DP和同样的方程被斜率优化了一下的答案不同时,不要去调试,直接去检查上面的各个函数是否写错或抄到代码中抄错了, 或者重推一遍.(注意决策点是否可能会重