标签:更新 整数 十分 建立 put 否则 内心 基础 成功率
描述
sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以保证自己能够有资格过今年的光棍节。
这次sqybi为了增加成功率,希望先对他提前确定的几个人定一下重要度。每个人的重要度都用一个自然数表示,这里的自然数包括0。
现在sqybi的心目中已经有了一些对于这些人的看法。他对于某个人的看法是基于另一个人的基础之上的,比如他会认为a比b的重要度至少大k。
现在给定sqybi心目中所有的看法,现在希望你能够对这些人排出一些重要度,使得在这些重要度满足所有看法的同时每个人的重要度都最低。
输入
第一行是两个正整数n和m,表示sqybi确定的人数以及sqybi心中的看法数目。这n个人的编号是1到n。
接下来m行,每行三个正整数a,b,k,表示编号为a的人的重要度比编号为b的人的重要度至少大k。
输出
仅一行,有n个正整数,表示n个人满足条件时的最小重要度。
输入样例 1
5 6 1 2 2 1 3 1 3 2 2 5 4 1 5 3 3 4 2 3
输出样例 1
3 0 2 3 5
给出一些边的大小关系 或者前后关系 要求排序或者搞什么的 很明显就是拓扑排序
这是一题有关权值的拓扑排序
每次更新最大值即可 否则某些起始边就为负数了
还有注意三维的写法 a b c三维 不需要重新建立mp
直接两个vector即可!!!!
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 10005 int in[N]; vector<int>edge[N]; vector<int>d[N]; //一开始我写成mp[N][N]就错了 奇怪 long ans[N]; int main() { int n,m; RII(n,m); while(m--) { int a,b,c; RIII(a,b,c); in[a]++; edge[b].push_back(a); d[b].push_back(c); } queue<int>q; for(int i=1;i<=n;i++) //n 节点的总数 if(in[i]==0) q.push(i); //将入度为0的点入队列 while(!q.empty()) { int p=q.front(); q.pop(); if(edge[p].size()) for(int i=0;i<edge[p].size();i++) { int y=edge[p][i]; ans[y]=max(ans[y],ans[p]+d[p][i]); in[y]--; if(in[y]==0) q.push(y); } } printf("%ld",ans[1]); rep(i,2,n) printf(" %ld",ans[i]); return 0; }
标签:更新 整数 十分 建立 put 否则 内心 基础 成功率
原文地址:https://www.cnblogs.com/bxd123/p/10556160.html