关键路径算法(PAT How Long Does It Take (25))

#include<iostream>
#include<stack>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std ;
#define MAXN 100 

int map[MAXN][MAXN] ;
int in_cout[MAXN] ;
int	e_time[MAXN] ;
int arry[MAXN] ;
int n , e , n_s = 1 ,sum ;

int max(int x , int y){

	return x > y ? x : y ;
}

void get_et(){

	int i ,j;
	stack<int> s ;
	for(i = 0 ; i < n ;i++){

		if(!in_cout[i])
			s.push(i) ;//得到起始点

	}
	int sep = 0 ;
	while(!s.empty()){

		int flag = s.top() ; s.pop() ;
		arry[sep++] = flag ;

		for(i = 0 ; i < n ; i++){

			if(map[flag][i]){//将与flag相连的点,入度减去,并判断是否符合条件进入S。

				in_cout[i]--;
				if(!in_cout[i])	 s.push(i) ;
			}
		}
	}
	e_time[0] = 0 ;
	if(sep < n-1){
		n_s = 0 ;
		return ;
	}
	int juci = 0 ;
	for(i = 1 ; i < n ; i++){

		int t = arry[i] ;
		for( j = 0 ; j < n ; j++ ){

			if(map[j][t]){

				e_time[t] = max(e_time[j]+map[j][t] , e_time[t]) ;

			}
			juci = max(juci , e_time[t]) ;//记录整个路线上最大的值
		}
		sum = juci ;
	}

}

int main(){

	int i , j ,v ,u , w ;
	memset(map , 0 ,sizeof(map)) ;
	memset(in_cout , 0 ,sizeof(in_cout)) ;
	scanf("%d%d" ,&n,&e) ;
	for(i = 0 ; i < e ; i++){

		scanf("%d%d%d" ,&v,&u,&w) ;
		if(w){
			map[v][u] = w ;
			in_cout[u]++ ;
		}
	}

	get_et() ;
	if(n_s)
		printf("%d\n" ,sum) ;
	else
		printf("Impossible\n") ;

	return 0 ;
}
时间: 2024-11-05 16:08:28

关键路径算法(PAT How Long Does It Take (25))的相关文章

[从今天开始修炼数据结构]无环图的应用 —— 拓扑排序和关键路径算法

上一篇文章我们学习了最短路径的两个算法.它们是有环图的应用.下面我们来谈谈无环图的应用. 一.拓扑排序 博主大学学的是土木工程,在老本行,施工时很关键的节约人力时间成本的一项就是流水施工,钢筋没绑完,浇筑水泥的那帮兄弟就得在那等着,所以安排好流水施工,让工作周期能很好地衔接就很关键.这样的工程活动,抽象成图的话是无环的有向图. 在表示工程的有向图中,用顶点表示活动,弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,成为AOV网(Active On Vertex Network) ※ 若在

算法初步——排序 A1012.The Best Rank(25)

#include <bits/stdc++.h> #include<math.h> using namespace std; const int MAX_LEN = 2005; //const int MAX_D = 31; struct student{ int id; int Cgrade; int Mgrade; int Egrade; int Agrade; }stu[MAX_LEN]; int main(){ int n,m; scanf("%d%d"

迪杰斯特拉算法——PAT 1003

本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究就会发现越经典. 首先可以将整个图的节点看成两个集合:一个是S,一个是U-S.如果是求v0到图中各点的最短距离的话,那么S就是已经确认到v0距离最短的点,U-S则是对于整体的点集合U,还没有加入S集合的点. 这里提出一个算法总体的思想,将所有的点按照一定的原则加入到S集就是解集.而这个解法就是重点了

关键路径算法

相关概念: (1)AOE (Activity On Edges)网络 如果在无有向环的带权有向图中用有向边表示一个工程中的各项活动(Activity),用边上的权值表示活动的持续时间(Duration),用顶点表示事件(Event),则这样的有向图叫做用边表示活动的网络,简称AOE (Activity On Edges)网络.AOE网是一个带权的有向无环图.AOE网络在某些工程估算方面非常有用.例如,可以使人们了解: a.完成整个工程至少需要多少时间(假设网络中没有环)? b.为缩短完成工程所需

PAT B1035 插入与归并 (25 分)

根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列. 现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 输入格式: 输入在第一行给出正整数 N (≤100):随后一行给出原始序列的 N

PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)

1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11. In

PAT Advanced 1013 Battle Over Cities (25分)

It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any other highways to keep the rest of

PAT (Advanced Level) 1083. List Grades (25)

简单排序. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<iostream> #include<algorithm> using namespace std

PAT (Advanced Level) 1021. Deepest Root (25)

先并查集判断连通性,然后暴力每个点作为根节点判即可. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<queue> #include<vector> using namespace std; struct Edge { int a,b; }e[20000]; int n,sz