2 条题解
-
0
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> PII; const int N = 1005, INF = 0x3f3f3f3f; vector<PII> G[N]; using namespace std; struct node{int col, c, id;} a[12]; bool cmp(const node n1, const node n2) {return n1.col < n2.col;} int n, m, dp[N][1 << 10], g[1 << 10]; bool vis[N]; void dijkstra(int s) { memset(vis, 0, sizeof(vis)); priority_queue<PII, vector<PII>, greater<PII>> q; for(int i = 1; i <= n; i++) if(dp[i][s] != INF) q.push({dp[i][s], i}); while(!q.empty()) { int x = q.top().second; q.pop(); if(vis[x]) continue; vis[x] = 1; for(auto i : G[x]) { int y = i.first, w = i.second; if(dp[y][s] > dp[x][s] + w) { dp[y][s] = dp[x][s] + w; q.push({dp[y][s], y}); } } } } int solve(int cnt) { for(int S = 1; S < (1 << cnt); S++) { for(int i = 1; i <= n; i++) { for(int s = S - 1; s; s = S & (s - 1)) dp[i][S] = min(dp[i][S], dp[i][s] + dp[i][S ^ s]); } dijkstra(S); } int res = INF; for(int i = 1; i <= n; i++) res = min(res, dp[i][(1 << cnt) - 1]); return res; } int main() { int m, k; scanf("%d%d%d", &n, &m, &k); for(int i = 1, x, y, w; i <= m; i++) { scanf("%d%d%d", &x, &y, &w); G[x].push_back({y, w}); G[y].push_back({x, w}); } for(int i = 1; i <= k; i++) scanf("%d%d", &a[i].col, &a[i].id); sort(a + 1, a + k + 1, cmp); int Cn = 0; for(int i = 1; i <= k; i++) // 离散化 { if(a[i].col != a[i - 1].col) a[i].c = ++Cn; else a[i].c = Cn; } memset(g, 0x3f, sizeof(g)); for(int S = 1; S < (1 << Cn); S++) { memset(dp, 0x3f, sizeof(dp)); int cnt = 0; for(int j = 1; j <= k; j++) if((1 << (a[j].c - 1)) & S) dp[a[j].id][1 << cnt++] = 0; g[S] = solve(cnt); } for(int S = 1; S < (1 << Cn); S++) for(int s = S - 1; s; s = S & (s - 1)) g[S] = min(g[S], g[s] + g[S ^ s]); printf("%d\n", g[(1 << Cn) - 1]); return 0; } -
0
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; const int N=1005, INF=0x3f3f3f3f; vector<PII>G[N]; using namespace std; struct node{int col,c,id;}a[12]; bool cmp(const node n1, const node n2) {return n1.col < n2.col;} int n,dp[N][1<<10],g[1<<10];bool vis[N]; void dijkstra(int s) { memset(vis, 0, sizeof(vis)); priority_queue<PII,vector<PII>,greater<PII>> q; for(int i=1;i<=n;i++)if(dp[i][ s ]!=INF)q.push({dp[i][ s ],i}); while(!q.empty()) { int x=q.top().second;q.pop(); if(vis[x])continue; vis[x]=1; for(auto i:G[x]) { int y=i.first,w=i.second; if(dp[y][ s ]>dp[x][ s ]+w) { dp[y][ s ]=dp[x][ s ]+w; q.push({dp[y][ s ],y}); } } } } int solve(int cnt) { for(int S=1;S<(1<<cnt);S++) { for(int i=1;i<=n;i++) { for(int s=S-1;s;s=S&(s-1)) dp[i][S]=min(dp[i][S],dp[i][s]+dp[i][S^s]); } dijkstra(S); } int res=INF; for(int i=1;i<=n;i++) res=min(res,dp[i][(1<<cnt)-1]); return res; } int main() { int m,k;scanf("%d%d%d",&n,&m,&k); for(int i=1,x,y,w;i<=m;i++) { scanf("%d%d%d",&x,&y,&w); G[x].push_back({y,w}); G[y].push_back({x,w}); } for(int i=1;i<=k;i++) scanf("%d%d",&a[i].col,&a[i].id); sort(a+1,a+k+1,cmp); int Cn=0; for(int i=1;i<=k;i++) //离散化 { if(a[i].col != a[i-1].col )a[i].c=++Cn; else a[i].c=Cn; } memset(g,0x3f,sizeof(g)); for (int S=1;S<(1<<Cn);S++) { memset(dp,0x3f,sizeof(dp)); int cnt=0; for(int j=1;j<=k;j++) if( (1<<a[j].c - 1) & S ) dp[a[j].id][1<<cnt++] = 0; g[S]=solve(cnt); } for(int S=1;S<(1<<Cn);S++) for(int s=S-1;s;s=S&(s-1)) g[S]=min(g[S],g[s]+g[S^s]); printf("%d\n",g[(1<<Cn)-1]); return 0; }
- 1
信息
- ID
- 5671
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 2
- 上传者