• 最小斯坦纳树代码


    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int N = 103, M = 503, SZ = (1<<10)+3;
    
    int n,m,k,p[13];
    int ecnt, hd[N], nt[M*2+1], vr[M*2+1], w[M*2+1];
    void ad(int u, int v, int w_) { nt[++ecnt] = hd[u], hd[u] = ecnt; vr[ecnt] = v, w[ecnt] = w_;}
    
    int dp[N][SZ];
    
    int vis[N];
    priority_queue<pair<int, int> > q;
    void dij(int S) {
    	memset(vis, 0, sizeof vis);
    	while(!q.empty())
    	{
    		int x = q.top().second;
    		q.pop();
    		if(vis[x]) continue;
    		vis[x] = 1;
    		for(int i=hd[x]; i; i=nt[i]) {
    			int y = vr[i];
    			if(dp[y][S] > dp[x][S] + w[i]) {
    				dp[y][S] = dp[x][S] + w[i];
    				q.push(make_pair(-dp[y][S], y));
    			}
    		}
    	}
    }
    
    int main() {
    	memset(dp, 0x3f, sizeof dp);
    	
    	scanf("%d%d%d", &n, &m, &k);
    	for(int i=1; i<=m; ++i) {
    		int x,y,z; scanf("%d%d%d", &x, &y, &z); ad(x,y,z); ad(y,x,z);
    	}
    	for(int i=1; i<=k; ++i) {
    		scanf("%d", &p[i]);
    		dp[p[i]][1<<(i-1)] = 0;
    	}
    	for(int S=1; S<(1<<k); ++S) {
    		for(int i=1; i<=n; ++i) {
    			for(int subs = (S-1)&S; subs; subs = (subs-1)&S)
    				dp[i][S] = min(dp[i][S], dp[i][subs] + dp[i][S ^ subs]);
    			if(dp[i][S] != 0x3f3f3f3f) q.push(make_pair(-dp[i][S], i));
    		}
    		dij(S);
    	}
    	cout << dp[p[1]][(1<<k)-1];
    	return 0;
    }
  • 相关阅读:
    轻松背后的N+疲惫——系统日志
    Wcf实现IServiceBehavior拓展机制
    一个迭代小算法,根据指定的个数对下标进行分组
    SqlServer 游标用法
    DataView RowFilter
    Asp.net Repeater 排序
    asp.net 导出Excel
    C# 导出Excel(csv )
    C# 上传图片
    C# 调用外部.exe文件
  • 原文地址:https://www.cnblogs.com/tztqwq/p/14228703.html
Copyright © 2020-2023  润新知