拓扑排序
参考dl的博客
看的是可能会Mle的邻接矩阵
那个f[i]是指到i的边数,所以最后满足从入度为0到出度为0加的那个f[i]就是答案
#include<bits/stdc++.h>
using namespace std;
int n,m,ru[5005],chu[5005],a,b,f[5005],ans;
int mp[5005][5005];
queue<int> q;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
scanf("%d%d", &a, &b);
mp[a][b]=1;//记录关系
chu[a]++;
ru[b]++;//记录入度和出度
}
for(int i=1;i<=n;i++){
if(ru[i]==0) {
f[i]=1;
q.push(i);//入度为零的入队
}
}
while(!q.empty()){//队列不为空
int a=q.front();
q.pop();//出队
for(int k=1;k<=n;k++){
if(mp[a][k]==0)continue;
f[k]+=f[a];//更新
f[k]%=80112002;
ru[k]--;//食物少了一个
if(ru[k]==0){//入度为零才入队
if(chu[k]==0){
ans+=f[k];
ans%=80112002;
continue;//有没有都行
}
q.push(k);
}
}
}
cout<<ans;
}
一开始t了一个,,因为数据开小了,,,感谢大佬拔手相助!
//
//created by Arc on 2021/2/16
//
//p1807 of luogu
//不知道为什么t了一个样例
#include<iostream>
#include<vector>
#include <algorithm>
#include <queue>
#include <cstring>
#include <stdio.h>
using namespace std;
const int N=10002,M=10002;
int head[N],ver[M],edge[M],Next[M],d[N];
int n,m,tot=0;
queue<int> q;
bool v[N];
void add(int x,int y,int z){
ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
}
void spfa(){
memset(d,-1,sizeof(d));
memset(v,0,sizeof(v));
d[1]=0;
v[1]=1;
q.push(1);
while(!q.empty()){
int x=q.front();
q.pop();
v[x]=0;
for (int i = head[x]; i ;i=Next[i]) {
int y=ver[i],z=edge[i];
if(d[y]<d[x]+z){
d[y]=d[x]+z;
if(!v[y]){
q.push(y);
v[y]=1;
}
}
}
}
}
int main(){
cin>>n>>m;
for (int i = 0; i < m; ++i) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
spfa();
printf("%d",d[n]);
}