luogu 图论刷题2

p4017

拓扑排序

参考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; 
}

p1807

一开始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]);
}
posted @ 2021-02-17 17:32  安之若醇  阅读(41)  评论(0编辑  收藏  举报
Live2D服务支持