我是靠谱客的博主 迅速黑米,最近开发中收集的这篇文章主要介绍牛客练习赛17 -- E(TSP+spfa),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

链接: https://www.nowcoder.com/acm/contest/109/E
来源:牛客网

写了好久终于过了,

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
typedef pair<int,int> pii;
/*void dis(int a[], int n){
	printf("总数为%d个n",n); 
	for(int i = 0; i < n; i++) 	cout<<a[i]<<", ";
	cout<<endl<<"------------------"<<endl;		
}*/

const int mx = 1e5+10;
const ll inf = 0x3f3f3f3f;
int vis[mx], dis[mx],s[25][25],p[25],dp[25][10005],id[mx];
int n,m,sco;  
/*struct node{  
    int to, w;  
};*/  
vector<pii> ve[mx];  
queue <int>q; 

void spfa(int u,int id){  
    memset(dis, 63, sizeof (dis));  
    memset(vis, 0, sizeof(vis));  
    while(!q.empty()) q.pop();  
  
    dis[u] = 0;  
    q.push(u);  
    vis[u] = 1;  
    while(!q.empty()){  
        int x = q.front();  
        q.pop();  
        vis[x] = 0;  
        for(int i = 0; i < ve[x].size(); i++){     
            pii te= ve[x][i];  
            if(dis[x] + te.second < dis[te.first]){  
                dis[te.first] = dis[x] + te.second;  
                if(!vis[te.first]){  
                    vis[te.first] = 1;  
                    q.push(te.first);  
                }  
            }  
        }  
    }  
     
  
	  
    for(int i = 0; i <= sco; i++)  
          s[id][i]=dis[p[i]]; 
      
}  

int dfs(int u,int sta){
//	printf("sta =%dn",sta);
	if(sta == 0)	return s[u][0];
	if(dp[u][sta] != 0x3f3f3f3f)	return dp[u][sta];
	for(int i = 1; i <= sco; i++){
		if((1<<(i-1))&sta)
			dp[u][sta] = min(dp[u][sta],s[u][i]+dfs(i,sta^(1<<(i-1))));
	}		
	return dp[u][sta];
}
	


int main(){
	int T=10;
	scanf("%d",&T);

	while(T--){
		scanf("%d%d",&n,&m);
		
		for(int i = 0; i <n; i++)      //忘记初始化 
			ve[i].clear();
			
		int a, b, c;
		pii te;
		for(int i = 0; i< m; i++){
			scanf("%d%d%d",&a,&b,&c);
			te.first = b; te.second = c;
			ve[a].push_back(te);
			te.first = a;
			ve[b].push_back(te);
		}
		
		scanf("%d",&sco);
		p[0] = 0;
		id[0] = 0;
		for(int i = 1; i <= sco; i++){
			scanf("%d",&p[i]);
			id[p[i]]  = i;
			//spfa2(p[i],i);         //不可以在这里一边输入一边spfa 
		}
		
		for(int i = 0; i <= sco; i++){
			
			spfa(p[i],i);
		}
	
		
		memset(dp,0x3f3f3f3f,sizeof(dp));   //不能初始化为-1 
		
	
		cout<<dfs(0,(1<<sco)-1)<<endl;
	}	
	
	
	return 0;
}

最后

以上就是迅速黑米为你收集整理的牛客练习赛17 -- E(TSP+spfa)的全部内容,希望文章能够帮你解决牛客练习赛17 -- E(TSP+spfa)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部