p1229
原来没看数据 打啦个暴力30分......;
然后想了想用spfa优化了一下 结果20分......;
书上说用拓扑 但我自己造的数据把拓扑完美推翻.......
后来才看到题目上说的是n个代表路的相交处.....
从新整理思路:
n为路的相交处 入度为0的 点只有起点 ,图不构成环 >>>推得 拓扑构图成立。
然后就是两个关键的虱子了:
最后记得要-1;
代码
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> using namespace std; struct { int v,y,next; }e[1000000]; int lin[100000]={}; int id[1000000]={}; int len=0; int init(int x,int y,int v) { e[++len].next=lin[x]; e[len].v=v; e[len].y=y; lin[x]=len; id[y]++; } int q[1000000]; int sum[100000]={}; int tt[1000000]={}; int head=0,tail=0; int topsort(int x) { q[++tail]=x; while(head<tail) { head++; int w=q[head]; for(int i=lin[w];i;i=e[i].next) { int y=e[i].y; id[y]--; sum[y]+=sum[w]+e[i].v*tt[w],sum[y]%=10000; tt[y]+=tt[w],tt[y]%=10000; if(id[y]==0) { q[++tail]=y; } } } return 0; } int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int m,n,s,s1,t; cin>>n>>m>>s>>s1>>t; for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; init(a,b,c); } tt[s]=1; topsort(s); //cout<<tt[s1]<<endl; cout<<(sum[s1]+(tt[s1]-1)*t)%10000<<endl; return 0; }