• 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]);
    }
    
    为了自己,和那些爱你的人
  • 相关阅读:
    Linux日志清除
    QT vs x64编译
    VC调用QT的UIDLL
    QT UI获得控件ID(HWND)
    安卓黑客工具
    VMware+Windgb+Win7内核驱动调试
    ubuntu 键盘布局修改
    魅族MX3 smart bar处失灵
    把NDK的工具链提取出来单独使用
    arm指令版本
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/14408530.html
Copyright © 2020-2023  润新知