拓扑排序判断是否成环。使用vector做邻接表。这部分正常写
最小金额的话 我是对每个人初始都是888.
然后举个例子
a是某一个入度为0的人,之后在a的邻接表中的人金额都要变化
当b的金额变化是 如果b金额本身就大于a(a之前某个点遍历时操作过b金额了) 不需要增加
但如果小于等于a的金额,b的金额就更新为 a金额+1
我觉得这个题要点就在这里吧
#include <bits/stdc++.h>
using namespace std;
int visit[10001]={0};
struct node
{
vector<int>arr;
int in;
int monery;
};
node *li=NULL;
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
int n,m,a,b;
while (~scanf("%d%d",&n,&m))
{
li=new node[n+1];
for(int i=1;i<=n;i++)
{
li[i].in=0;
visit[i]=0;
li[i].monery=888;
}
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
li[b].arr.push_back(a);
li[a].in++;
}
queue<int>q;
long long out=0;
for(int i=1;i<=n;i++)
{
if(li[i].in==0){
q.push(i);
visit[i]=1;
}
}
int cnt=0;
while (!q.empty())
{
int t=q.front();q.pop();cnt++;
out+=li[t].monery;
for(int i=0;i<li[t].arr.size();i++)
{
int temp=li[t].arr[i];
li[temp].in--;
if(li[temp].monery<=li[t].monery)li[temp].monery=li[t].monery+1;
if(li[temp].in==0&&visit[temp]==0)
{
q.push(temp);
visit[temp]=1;
}
}
}
if(cnt==n)printf("%lld\n",out);
else printf("-1\n");
}
return 0;
}