BZOJ4774 修路

来源:互联网 发布:算命软件下载 编辑:程序博客网 时间:2024/04/29 16:18

同BZOJ4006

#include<iostream>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<cstdlib>#include<cstdio>#include<map>#include<bitset>#include<set>#include<stack>#include<vector>#include<queue>using namespace std;#define MAXN 10010#define MAXM 10010#define MAXD 256#define ll long long#define eps 1e-8#define MOD 1000000007#define INF 1000000000struct vec{int to;int fro;int v;};vec mp[MAXM*2];int tai[MAXN],cnt;int n,m,p;vector<int>ps[20];int f[MAXD];int g[MAXD][MAXN];int col[MAXN],c;int t[MAXN],tot;int q[MAXN],hd,tl;bool iq[MAXN];int nc[MAXN],NC;int num[MAXN];inline void be(int x,int y,int z){mp[++cnt].to=y;mp[cnt].fro=tai[x];tai[x]=cnt;mp[cnt].v=z;}inline void bde(int x,int y,int z){be(x,y,z);be(y,x,z);}void spfa(int *g){int i,x,y;while(hd!=tl){iq[x=q[(hd%=MAXN)++]]=0;for(i=tai[x];i;i=mp[i].fro){y=mp[i].to;if(g[x]+mp[i].v<g[y]){g[y]=g[x]+mp[i].v;if(!iq[y]){iq[q[(tl%=MAXN)++]=y]=1;}}}}}int cal(){int i,j,k;int T=1<<tot;for(i=1;i<T;i++){for(j=1;j<=n;j++){g[i][j]=INF;if(nc[j]==NC){if(i==(1<<num[j]-1)){g[i][j]=0;}}for(k=i&i-1;k;k=i&k-1){g[i][j]=min(g[i][j],g[k][j]+g[i^k][j]);}if(g[i][j]!=INF){iq[q[(tl%=MAXN)++]=j]=1;}}spfa(g[i]);}int re=INF;for(i=1;i<=n;i++){re=min(re,g[T-1][i]);}return re;}int main(){int i,j,k,x,y,z;scanf("%d%d%d",&n,&m,&p);for(i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);bde(x,y,z);}for(i=1;i<=p;i++){ps[i].push_back(i);ps[i].push_back(n-i+1);}for(i=1;i<=p;i++){if(ps[i].size()>1){col[++c]=i;}}int C=1<<c;for(i=1;i<C;i++){tot=0;NC++;for(j=1;j<=C;j++){if(i&(1<<j-1)){for(k=0;k<ps[col[j]].size();k++){tot++;nc[ps[col[j]][k]]=NC;num[ps[col[j]][k]]=tot;}}}f[i]=cal();}for(i=1;i<C;i++){for(j=i&i-1;j;j=i&j-1){f[i]=min(f[i],f[j]+f[i^j]);}}printf("%d\n",f[C-1]==INF?-1:f[C-1]);return 0;}/*10 20 46 5 16 9 49 4 29 4 106 1 22 3 67 6 105 7 19 7 25 9 101 6 84 7 45 7 12 6 910 10 68 7 210 9 101 2 410 1 89 9 7*/


0 0
原创粉丝点击