Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project.

Input Specification:

Each input file contains one test case. Each case starts with a line containing two positive integers N (≤100), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N−1), and M, the number of activities. Then M lines follow, each gives the description of an activity. For the i-th activity, three non-negative numbers are given: S[i], E[i], and L[i], where S[i] is the index of the starting check point, E[i] of the ending check point, and L[i] the lasting time of the activity. The numbers in a line are separated by a space.

Output Specification:

For each test case, if the scheduling is possible, print in a line its earliest completion time; or simply output "Impossible".

Sample Input 1:

9 12
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
5 4 0
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4

Sample Output 1:

18

Sample Input 2:

4 5
0 1 1
0 2 2
2 1 3
1 3 4
3 2 5

Sample Output 2:

Impossible

我的答案
 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h> #define ERROR -1
#define false 0
#define true 1
#define MaxVertexNum 100
#define INFINITY 65535
#define MaxQueue 100
typedef int Vertex;
typedef int WeightType;
typedef int bool; //边
typedef struct ENode *PtrToENode;
struct ENode {
Vertex V1, V2;
WeightType Weight;
};
typedef PtrToENode Edge; //邻接点
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode {
Vertex AdjV; //下标
WeightType Weight; //边权重
PtrToAdjVNode Next; //指向下一个邻接点
}; //顶点
typedef struct VNode {
PtrToAdjVNode FirstEdge; //边表头指针
// DataType Data; //存顶点的户数据
}AdjList[MaxVertexNum]; //图结点
typedef struct GNode *PtrToGNode;
struct GNode {
int Nv;
int Ne;
AdjList G;
};
typedef PtrToGNode LGraph; struct QNode {
Vertex Data[MaxQueue];
int rear;
int front;
};
typedef struct QNode *Queue; int IsEmptyQ(Queue PtrQ)
{
return (PtrQ->front == PtrQ->rear);
} void AddQ(Queue PtrQ, Vertex item)
{
if((PtrQ->rear+)%MaxQueue == PtrQ->front) {
printf("Queue full");
return;
}
PtrQ->rear = (PtrQ->rear+)%MaxQueue;
PtrQ->Data[PtrQ->rear] = item;
} Vertex DeleteQ(Queue PtrQ)
{
if(PtrQ->front == PtrQ->rear) {
printf("Queue Empty");
return -;
} else {
PtrQ->front = (PtrQ->front+)%MaxQueue;
return PtrQ->Data[PtrQ->front];
}
} LGraph CreateGraph(int VertexNum)
{
Vertex V;
LGraph Graph; Graph = (LGraph)malloc(sizeof(struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = ; for(V=;V<Graph->Nv;V++)
Graph->G[V].FirstEdge = NULL; return Graph;
} void InsertEdge(LGraph Graph, Edge E)
{
PtrToAdjVNode NewNode; //有向边
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V2;
NewNode->Weight = E->Weight;
//向V1插入V2
NewNode->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode;
} LGraph BuildGraph()
{
LGraph Graph;
Edge E;
int Nv, i; scanf("%d", &Nv);
Graph = CreateGraph(Nv); scanf(" %d\n", &(Graph->Ne));
if(Graph->Ne != ) {
E = (Edge)malloc(sizeof(struct ENode));
for(i=;i<Graph->Ne;i++) {
scanf("%d %d %d\n", &E->V1, &E->V2, &E->Weight);
InsertEdge(Graph, E);
}
} return Graph;
} void PrintGraph(LGraph Graph)
{
Vertex V;
PtrToAdjVNode W;
for(V=;V<Graph->Nv;V++) {
printf("%d:", V);
for(W=Graph->G[V].FirstEdge;W;W=W->Next) {
printf("[%3d %3d] ", W->AdjV, W->Weight);
}
printf("\n");
}
} /* 邻接表存储 - 拓扑排序算法 */
bool TopSort( LGraph Graph, Vertex TopOrder[], Vertex Earliest[])
{ /* 对Graph进行拓扑排序, TopOrder[]顺序存储排序后的顶点下标 */
int Indegree[MaxVertexNum], cnt;
Vertex V;
PtrToAdjVNode W; Queue Q = (Queue)malloc(sizeof(struct QNode)*( Graph->Nv )); /* 初始化Indegree[] */
for (V=; V<Graph->Nv; V++)
Indegree[V] = ; /* 遍历图,得到Indegree[] */
for (V=; V<Graph->Nv; V++)
for (W=Graph->G[V].FirstEdge; W; W=W->Next)
Indegree[W->AdjV]++; /* 对有向边<V, W->AdjV>累计终点的入度 */ /* 将所有入度为0的顶点入列 */
for (V=; V<Graph->Nv; V++)
if ( Indegree[V]== ) {
AddQ(Q, V);
Earliest[V] = ; //起点为0
} /* 下面进入拓扑排序 */
cnt = ;
while( !IsEmptyQ(Q) ){
V = DeleteQ(Q); /* 弹出一个入度为0的顶点 */
TopOrder[cnt++] = V; /* 将之存为结果序列的下一个元素 */
/* 对V的每个邻接点W->AdjV */
for ( W=Graph->G[V].FirstEdge; W; W=W->Next )
if ( --Indegree[W->AdjV] == ) {/* 若删除V使得W->AdjV入度为0 */
AddQ(Q, W->AdjV); /* 则该顶点入列 */
Earliest[W->AdjV] = Earliest[V] + W->Weight;
// if((Earliest[V]+W->Weight)>Earliest[W->AdjV] && Earliest[W->AdjV])
// Earliest[W->AdjV] = Earliest[V] + W->Weight;
}
} /* while结束*/ if ( cnt != Graph->Nv )
return false; /* 说明图中有回路, 返回不成功标志 */
else
return true;
} int main()
{
LGraph Graph;
WeightType Earliest[MaxVertexNum];
Vertex TopOrder[MaxVertexNum],V;
int ret; Graph = BuildGraph();
// PrintGraph(Graph);
ret = TopSort(Graph, TopOrder, Earliest);
if(ret == false) {
printf("Impossible");
} else if(ret == true) {
int max = Earliest[];
for(int i=;i<Graph->Nv;i++) {
// printf("%d: [%d]\n", i, Earliest[i]);
if(max < Earliest[i])
max = Earliest[i];
}
printf("%d", max);
}
// printf("TopOrder:");
// for(V=0;V<Graph->Nv;V++)
// printf("%d ", TopOrder[V]);
// printf("\n");
return ;
}

08-图8 How Long Does It Take(25 分)邻接表和队列的更多相关文章

  1. 图的bfs遍历模板(邻接矩阵存储和邻接表存储)

    bfs遍历图模板伪代码: bfs(u){ //遍历u所在的连通块 queue q; //将u入队 inq[u] = true; while (q非空){ //取出q的队首元素u进行访问 for (从u ...

  2. 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))

    sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个有向图 ...

  3. 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS

    图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...

  4. 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)

    数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...

  5. 图的邻接表存储表示(C)

    //---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...

  6. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  7. 邻接表存储图,DFS遍历图的java代码实现

    import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...

  8. Invitation Cards(邻接表+逆向建图+SPFA)

    Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 17538   Accepted: 5721 Description In ...

  9. 图的建立——邻接表表示(C语言+VC6.0平台)

    图是一种重要而且相对复杂的数据结构,在实际编程中非常有用.邻接表是图的主要表示形式之一,是一种链接表表示方法. #include<stdio.h> #include<stdlib.h ...

  10. 图的邻接表存储 c实现

    图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...

随机推荐

  1. CAS 认证

    Central Authentication Service http session 保持机制 1.  用户向服务端发送密码,服务端生成与用户对应的 sessionid 2. 服务端将这个 sess ...

  2. mysql之存储过程基础篇

    1.  创建/使用数据库 mysql> create database me; mysql> use me; 2.  创建表 mysql> create table Stu(Sno ...

  3. 学习HTML5 全局属性 accesskey-title

    属性classcontextmenu指定一个元素的上下文菜单.当用户右击该元素,出现上下文菜单dirdropzone指定是否将数据复制,移动,或链接,或删除idspellcheck检测元素是否拼写错误 ...

  4. vuex基本使用

    1.组件之间共享数据的方式 父向子传值:v-bind 属性绑定 子向父传值:v-on 事件绑定 兄弟组件之间共享数据:EventBus $on 接收数据的那个组件 $emit 发送数据的那个组件 2. ...

  5. 《剑指offer》面试题4 替换空格 Java版

    (给一个足够长的字符数组,其中有一段字符,将' '(空格)替换成'%' '2' '0'三个字符,原字符段由'\0'结尾) 书中方法:这道题如果从头到尾扫描数组并替换,会涉及到数组的移动.如果不移动元素 ...

  6. LeetCode #938. Range Sum of BST 二叉搜索树的范围和

    https://leetcode-cn.com/problems/range-sum-of-bst/ 二叉树中序遍历 二叉搜索树性质:一个节点大于所有其左子树的节点,小于其所有右子树的节点 /** * ...

  7. springcloud费话之Eureka服务访问(restTemplate)

    目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud ...

  8. Linux就该这么学09学习笔记

    参考链接:https://www.linuxprobe.com/chapter-09.html 配置网卡服务 配置网卡参数 1.执行nmtui命令运行网络配置工具 2.选中Edit a connect ...

  9. 微信小程序(16)-- bindtap,catchtap事件绑定的区别

    bindtap,catchtap事件绑定的区别,这里就涉及冒泡事件了.bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡. logs.wxml <view cl ...

  10. spark- PySparkSQL之PySpark解析Json集合数据

    PySparkSQL之PySpark解析Json集合数据 数据样本 12341234123412342|asefr-3423|[{"}] 正菜: #-*- coding:utf-8 –*- ...