2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-H Skiing

来源:互联网 发布:项城市乡镇人口数据 编辑:程序博客网 时间:2024/04/25 20:03

思路:拓扑排序依次查找flag,dp[]进行状态转移即可。

代码如下:

#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#define LL long longusing namespace std;struct Edge{int to,next,w;}edge[200010];LL head[20010],deg[20010],dp[20010];int n,m,t,cnt;void add(int u, int v, int w){deg[v] ++;edge[cnt].to = v;edge[cnt].next = head[u];edge[cnt].w = w;head[u] = cnt ++;}void toposort(){priority_queue<int, vector<int>, greater<int> > q;for(int i = 1; i <= n; i ++){if(!deg[i]){q.push(i); deg[i] --;for(int j = head[i]; j != -1; j = edge[j].next){int k = edge[j].to;if(dp[k] < edge[j].w) dp[k] = edge[j].w;}}}while(!q.empty()){int v = q.top(); q.pop();for(int i = head[v]; i != -1; i = edge[i].next){int b = edge[i].to;deg[b] --; dp[b] = max(dp[b],dp[v] + edge[i].w);   if(!deg[b]) q.push(b),deg[b] --;}}}int main(){scanf("%d",&t);while(t --){scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));memset(deg,0,sizeof(deg));memset(dp,0,sizeof(dp));int u,v,w;cnt = 0;for(int i = 1; i <= m; i ++){scanf("%d%d%d",&u,&v,&w);int j;for(j = head[u]; j != -1; j = edge[j].next){if(edge[j].to == v) break;}if(j != -1)edge[j].w = max(w,edge[j].w);else add(u,v,w);}toposort();LL mxx = -1;for(int i = 1; i <= n; i ++){mxx = max(mxx,dp[i]);}printf("%lld\n",mxx);}return 0;}


阅读全文
0 0