PAT(MOOC-数据结构) 06-4. How long does it take (25)

37 篇文章 0 订阅
#include<cstring>
#include<iostream>
#include<fstream>
using namespace std;
//ifstream fin("06-4.txt");
//#define cin fin
#define MAX 101
typedef struct edge *ed;
struct edge{
	int weight;
}edge[MAX][MAX];
int n, m;
int start, end1;
bool vst[MAX];//此题是因为要判定环路 才设定vst数组的 否则是不用的
int path = 0, max_path = -1;
bool dfs(int v){
	if (path > max_path){
		end1 = v;
		max_path = path;
	}
	for (int i = 0; i < n; i++){
		if (edge[v][i].weight > 0){
			if (vst[i]){
				return false;
			}
			path += edge[v][i].weight;
			vst[i] = true;
			if (!dfs(i))	return false;
			path -= edge[v][i].weight;
			vst[i] = false;
		}
	}
	return true;
}
void dfs_re(int v){
	if (path > max_path){
		end1 = v;
		max_path = path;
	}
	for (int i = 0; i < n; i++){
		if (edge[i][v].weight > 0){
			path += edge[i][v].weight;
			dfs_re(i);
			path -= edge[i][v].weight;
		}
	}
}
int main(){
	cin >> n >> m;
	memset(edge, -1, sizeof(edge));
	int c1, c2, w;
	for (int i = 0; i < m; i++){
		cin >> c1 >> c2 >> w;
		edge[c1][c2].weight = w;
	}
	int i, j;
	for (j = 0; j < n; j++){
		for (i = 0; i < n;i++)
		if (edge[i][j].weight != -1)	break;
		if (i == n)	break;
	}
	if (j == n){
		printf("Impossible\n"); return 0;
	}
	start = j;
	/*
	从这个入度为0的点开始沿正向深度遍历,找到那最远的点
	*/
	vst[start] = true;
	if (!dfs(start)){
		printf("Impossible\n"); return 0;
	}
	vst[start] = false;
	start = end1;/* 再从最远点逆序遍历 找最远点- - 只要求得max_path值即可 */
	path = 0;
	dfs_re(start);
	printf("%d\n", max_path);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值