神秘岛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:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include#include#include#include#include#include#include#include

using namespacestd;const int maxn=9999999;intn,m,st,en,t;int len=0,dis[60000],lin[maxn],ans=0,sum[60000];int id[60000];intq[maxn];structnode

{intx,y,v;

}e[60000];void init(int xx,int yy,intvv)

{

e[++len].y=lin[xx];lin[xx]=len;e[len].x=yy;e[len].v=vv;

}voidpai()

{int head=0,tail=0;

q[++tail]=st;

sum[st]=1;/*for(int i=0;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;

}

}

}intmain()

{/*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++)

{intxx,yy,vv;

cin>>xx>>yy>>vv;

init(xx,yy,vv);

id[yy]++;

}

pai();

cout<

}

View Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值