zoukankan      html  css  js  c++  java
  • 神秘岛。。(拓扑排序)

    FireDancer来到一个神秘岛,他要从岛的西头到东头然后在东头的码头离开。可是当他走了一次后,发现这个岛的景色非常的美丽,于是他从东头的传送门传到了西头,换了一种走法又走了一遍。发现还不过瘾,又走了一遍……终于,FireDancer把所有的从西头到东头的路径都走了一遍。他站在岛东头的海滩上,突然想到了一个问题,那就是他一共花了多少时间。他把这个问题交给了你。
    FireDancer把这个岛抽象成了一个图,共n个点代表路的相交处,m条边表示路,边是有向的(只能按照边的方向行走),且可能有连接相同两点的边。输入保证这个图没有环,而且从西头到东头至少存在一条路径。两条路径被认为是不同的当且仅当它们所经过的路不完全相同。
    保证 起点是唯一入度为0 的点。

    INPUT:

    第一行为5个整数,n、m、st、en、t,分别表示点数(编号是从1到n),边数,岛西头的编号,岛东头的编号和传送一次的时间。
    以后m行,每行3个整数,x、y、t,表示从点x到点y有一条行走耗时为t的路。
    且:2<=n<=10000; 1<=m<=50000;t<=10000;t0<=10000。

    3 4 1 3 7
    1 2 5
    2 3 7
    2 3 10
    1 3 15

    OUTPUT:

    若总耗时为total,则输出total mod 10000(total对10000取余)。

    56

    [样例说明]
    共有3条路径可以从点1到点3,分别是1-2-3,1-2-3,1-3。时间计算为:
    (5+7)+7 +(5+10)+7 +(15)=56

    思路:

    这道题最难的地方是算有几条路,并且每次都要加上不重复路的权值。

    所以核心为:

     1 sum[tmp]=(sum[tmp]+sum[q[head]])%10000;

    2 dis[tmp]=(dis[tmp]+sum[q[head]]*e[i].v+dis[q[head]])%10000; 

    cpp:

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<iomanip>
    #include<queue>
    using namespace std;
    const int maxn=9999999;
    int n,m,st,en,t;
    int len=0,dis[60000],lin[maxn],ans=0,sum[60000];
    int id[60000];
    int q[maxn];
    struct node
    {
        int x,y,v;
    }e[60000];
    
    void init(int xx,int yy,int vv)
    {
        e[++len].y=lin[xx];lin[xx]=len;e[len].x=yy;e[len].v=vv;
    }
    
    void pai()
    {
        
        int head=0,tail=0;
        q[++tail]=st;
        sum[st]=1;
        /*for(int i=0;i<n;i++)
            if(id[i]==0)    q[++tail]=i;*/
        while(head<=tail)
        {
            int tn=q[++head];
            int te=lin[tn];
            for(int i=te;i;i=e[i].y)
            {
                int tmp=e[i].x;
                id[tmp]--;
                sum[tmp]=(sum[tmp]+sum[q[head]])%10000;
                dis[tmp]=(dis[tmp]+sum[q[head]]*e[i].v+dis[q[head]])%10000;
                if(id[e[i].x]==0)
                    q[++tail]=e[i].x;
            }
        }
    }
    
    int main()
    {
        /*freopen("2.in","r",stdin);
        freopen("2.out","w",stdout);*/
        //ios::sync_with_stdio(false);
        cin>>n>>m>>st>>en>>t;
        memset(e,0,sizeof(e));
        memset(id,0,sizeof(id));
        for(int i=1;i<=m;i++)
        {
            int xx,yy,vv;
            cin>>xx>>yy>>vv;
            init(xx,yy,vv);
            id[yy]++;
        }
        pai();
        cout<<(dis[en]+sum[en]*t-t)%10000<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    个性化推荐系统(二)---构建推荐引擎
    个性化推荐系统(一)---今日头条等的内容划分、分类
    双11线上压测netty内存泄露
    数据、信息、知识、智慧
    ReentrantLock的相关方法使用
    公平锁和非公平锁
    Lock中使用Condition实现等待通知
    使用IO流将数据库中数据生成一个文件,结果使用Notepad++打开部分数据结尾出现NUL
    ThreadLocal的使用
    join方法
  • 原文地址:https://www.cnblogs.com/zyker/p/5943859.html
Copyright © 2011-2022 走看看