PAT A1003 Emergency (25 分)

在这里插入图片描述
看完了复杂的Dijstral算法后自己动手做的第一道练习题,不用看模板能够自己写下来啦(虽然不知道能记住几天)。

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXV = 510;
const int INF = 1e9;

int n, m, c1, c2;
int G[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV] = {
    
    false};
int team[MAXV];
int maxteam[MAXV];
int minpath[MAXV];

void Dijkstral(int s){
    
    
	fill(d, d+MAXV, INF);
	fill(maxteam, maxteam+MAXV, -1);
	fill(minpath, minpath+MAXV, 0);
	d[s] = 0;
	maxteam[s] = team[s];
	minpath[s] = 1;
	
	for(int i=0; i<n; i++){
    
    
		int u = -1, MIN = INF;
		for(int j=0; j<n; j++){
    
    
			if(vis[j]==false && d[j]<MIN){
    
    
				u = j;
				MIN = d[j];
			}
		}
		if(u == -1) return;
		vis[u] = true;
		for(int i=0; i<n; i++){
    
    
			if(vis[i]==false && G[u][i]!=INF){
    
    
				if(d[i] > d[u] + G[u][i]){
    
    
					d[i] = d[u] + G[u][i];
					maxteam[i] = maxteam[u] + team[i];
					minpath[i] = minpath[u];
				}else if(d[i] == d[u] + G[u][i]){
    
    
					if(maxteam[i] < maxteam[u] + team[i]){
    
    
						maxteam[i] = maxteam[u] + team[i];
					}
					minpath[i] += minpath[u];
				}
			}
		}
	} 
	
}

int main(){
    
    
	scanf("%d %d %d %d", &n, &m, &c1, &c2);
	for(int i=0; i<n; i++){
    
    
		scanf("%d", &team[i]);
	}
	
	int u, v, w;
	fill(G[0], G[0]+MAXV*MAXV, INF);
	for(int i=0; i<m; i++){
    
    
		scanf("%d %d %d", &u, &v, &w);
		G[u][v] = w;
		G[v][u] = G[u][v];
	}
	
	Dijkstral(c1);
	printf("%d %d", minpath[c2], maxteam[c2]);
	
	return 0;
}

Dijkstral+DFS解法

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXV = 510;
const int INF = 1e9;

int n, m, c1, c2;
int G[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV] = {
    
    false};
int team[MAXV];
int maxteam = -1;
int minpath = 0;
vector<int> pre[MAXV];
vector<int> tempPath, path;

void Dijkstral(int s){
    
    
	fill(d, d+MAXV, INF);
	d[s] = 0;
	
	for(int i=0; i<n; i++){
    
    
		int u = -1, MIN = INF;
		for(int j=0; j<n; j++){
    
    
			if(vis[j]==false && d[j]<MIN){
    
    
				u = j;
				MIN = d[j];
			}
		}
		if(u == -1) return;
		vis[u] = true;
		for(int i=0; i<n; i++){
    
    
			if(vis[i]==false && G[u][i]!=INF){
    
    
				if(d[i] > d[u] + G[u][i]){
    
    
					d[i] = d[u] + G[u][i];
					pre[i].clear();
					pre[i].push_back(u);
				}else if(d[i] == d[u] + G[u][i]){
    
    
					pre[i].push_back(u);
				}
			}
		}
	} 
}

void DFS(int v){
    
    
	if(v == c1){
    
    
		minpath++;
		tempPath.push_back(v);
		int num = 0;
		for(int i=0; i<tempPath.size(); i++){
    
    
			int index = tempPath[i];
			num += team[index];
		}
		if(num > maxteam){
    
    
			maxteam = num;
			path = tempPath;
		}
		tempPath.pop_back();
		return;
	}
	tempPath.push_back(v);
	for(int i=0; i<pre[v].size(); i++){
    
    
		DFS(pre[v][i]);
	}
	tempPath.pop_back();
}

int main(){
    
    
	scanf("%d %d %d %d", &n, &m, &c1, &c2);
	for(int i=0; i<n; i++){
    
    
		scanf("%d", &team[i]);
	}
	
	int u, v, w;
	fill(G[0], G[0]+MAXV*MAXV, INF);
	for(int i=0; i<m; i++){
    
    
		scanf("%d %d %d", &u, &v, &w);
		G[u][v] = w;
		G[v][u] = G[u][v];
	}
	
	Dijkstral(c1);
	DFS(c2);
	printf("%d %d", minpath, maxteam);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45964844/article/details/113773147
今日推荐