zoukankan      html  css  js  c++  java
  • 基础实验6-2.6 最短工期 (25分)-拓扑排序

     

     

     解题思路:采用拓扑排序思想

    #include <stdio.h>
    #include <string.h>
    #define MaxVex 100
    #define INF 0x3f3f3f3f
    int G[MaxVex][MaxVex];
    int InDegree[MaxVex]= {0};
    int time[MaxVex]= {0};
    int Nv,Ne;
    int ans=0,cnt=0;
    int max(int x,int y) {
    	return x>y?x:y;
    }
    void Init() {//图初始化
    	memset(G,-1,sizeof(G));
    	int i,v1,v2,weight;
    	for(i=0; i<Ne; i++) {
    		scanf("%d %d %d",&v1,&v2,&weight);
    		G[v1][v2]=weight;
    		InDegree[v2]++;
    	}
    }
    void Topo() {//拓扑排序
    	int i,j;
    	while(1) {
    		int flag=0;
    		for(i=0; i<Nv; i++) {
    			if(!InDegree[i]) {//找到入度为0的结点
    				InDegree[i]--;
    				flag=1;
    				cnt++;//统计入度为0的结点个数
    				for(j=0; j<Nv; j++) {
    					if(G[i][j]!=-1) {
    						InDegree[j]--;//度为0的结点所指向结点的入度减1
    						time[j]=max(time[j],time[i]+G[i][j]);//计算从i->j所花的最长路径长度
    						ans=max(ans,time[j]);//记录所有路径长度中的最大值(多个起点多个终点)
    					}
    				}
    			}
    		}
    		if(flag==0)
    			break;
    	}
    
    }
    
    int main() {
    	scanf("%d %d",&Nv,&Ne);
    	Init();
    	Topo();
    	if(cnt==Nv)//所有结点最后的和度均为-1,则存在拓扑排序,反之,则不存在拓扑排序
    		printf("%d",ans);
    	else
    		printf("Impossible");
    
    }
    

      

  • 相关阅读:
    Sql server数据库设计 7
    day08作业
    day01作业
    day07作业.
    day05作业
    day04作业
    day02作业
    初学Java的一些注意事项
    day07作业
    Week03面向对象入门
  • 原文地址:https://www.cnblogs.com/snzhong/p/12530556.html
Copyright © 2011-2022 走看看