PAT --- A1030 ---画像

ダイクストラ+ DSF
簡単な質問セットコード
DSF記憶ポップ

#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int INF=1000000;
int g[510][510];
int cost[510][510];
int dis[510];
int vis[510];
int n,m,s,d1;//城市数,公路数,起终点 
vector<int>pre[510];
void Dijkstra(int x){//s
	fill(dis,dis+510,INF);
	dis[x]=0;
	for(int i=0;i<n;i++){
		int u=-1;
		int min=INF;
		for(int j=0;j<n;j++){
			if(dis[j]<min&&vis[j]==0){
				u=j;
				min=dis[j];
			}
		}
		if(u==-1)return;
		vis[u]=1;
		for(int v=0;v<n;v++){
			if(g[u][v]!=INF&&vis[v]==0){
				if(dis[u]+g[u][v]<dis[v]){
					dis[v]=dis[u]+g[u][v];
					pre[v].clear();
					pre[v].push_back(u);
				}else if(dis[u]+g[u][v]==dis[v]){
					pre[v].push_back(u);
				}
			}	
		}
	}
}
vector<int>temp,path;
int cost1,mincost=INF;
void DSF(int x){//d1
	if(x==s){
		temp.push_back(x);
		cost1=0;
		int size=temp.size();
		for(int i=0;i<size-1;i++){
			cost1=cost1+cost[temp[i]][temp[i+1]];
		}
		if(cost1<mincost){
			path=temp;
			mincost=cost1;
		}
		temp.pop_back();
		return;
	}
	temp.push_back(x);
	for(int i=0;i<pre[x].size();i++){
		DSF(pre[x][i]);
	}
	temp.pop_back();
}
int main(){
	fill(g[0],g[0]+510*510,INF);
	scanf("%d%d%d%d",&n,&m,&s,&d1);
	int a,b,c,d;
	for(int i=0;i<m;i++){
		scanf("%d%d%d%d",&a,&b,&c,&d);
		g[a][b]=c;
		g[b][a]=c;
		cost[a][b]=d;
		cost[b][a]=d;
	} 

	fill(vis,vis+510,0);
	Dijkstra(s);
	DSF(d1);
	//for(int i=0;i<5;i++)printf("%d ",pre[i].size());
	for(int i=path.size()-1;i>=0;i--){
		printf("%d ",path[i]);
	}
	printf("%d %d\n",dis[d1],mincost);
} 

元の記事を30件公開 いいね1 訪問数398

おすすめ

転載: blog.csdn.net/weixin_46265246/article/details/105234463