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;
}
原文地址:https://www.cnblogs.com/Lazers/p/6479959.html