1639

来源:互联网 发布:电信宽带免费提速软件 编辑:程序博客网 时间:2024/06/08 10:31
#include<cstdio>#include<cstring>#include<iostream>#include<map>#include<string>using namespace std;#define rep(i,j,k) for(i=j;i<=k;++i)#define per(i,j,k) for(i=j;i>=k;--i)#define sqr(x) ((x)*(x))#define G getchar()#define LL long long#define pii pair<int,int>#define mkp make_pair#define X first#define Y second#define N 25#define NN 1000#define inf 2139062143map<string,int>mp;int n,m,w[N][N],w2[N][N];int blg[N],blk,sz[N],Min[N],vis[N];LL ans;int he2[N],Max[N];bool flg[N];int get(string s){map<string,int>::iterator ii=mp.find(s);return ii==mp.end()?mp[s]=++n:ii->Y;}void DFS(int x){int y;vis[x]=1;++sz[blg[x]=blk];rep(y,2,n)if(w[x][y]<inf&&!vis[y])DFS(y);}void add2(int x,int y,int z){ans+=w2[x][y]=w2[y][x]=z;}void Prim(int x){memset(Min,127,sizeof Min);int i,j=0,y,z;Min[x]=0;while(1){vis[x]=-1;if(++j==sz[blk])return;rep(y,2,n)if(w[x][y]<inf&&vis[y]>0)Min[y]=min(w[x][y],Min[y]);z=inf;rep(i,1,n)if(blg[i]==blk&&vis[i]>0&&z>Min[i])z=Min[y=i];add2(x,y,z);x=y;}}void dp(int x,int pre){int y;rep(y,2,n)if(w[x][y]<inf&&i!=pre){Max[y=to[i]]=W[Max[x]]>W[i]?Max[x]:i;dp(y,i^1);}}int main(){int x,y,z,i,j;string s1,s2;mp["Park"]=n=1;cin>>m;memset(w,127,sizeof w);memset(w2,127,sizeof w2);while(m--){cin>>s1>>s2>>z;x=get(s1);y=get(s2);w[y][x]=w[x][y]=min(w[x][y],z);}rep(i,2,n)if(!vis[i]){++blk;DFS(i);Prim(i);}memset(Min,0,sizeof Min);for(i=he[1];i;i=ne[i])if(!Min[y=blg[to[i]]]||W[Min[y]]>W[i])Min[y]=i;rep(i,1,blk)flg[Min[i]]=1,add2(1,to[Min[i]],W[Min[i]]);dp(1,0);cin>>m;for(m-=blk;m--;){x=0;for(i=he[1];i;i=ne[i])if(!flg[i]&&W[Max[to[i]]]-W[i]>x)x=W[Max[to[i]]]-W[y=i];flg[y]=flg[Max[to[y]]]=flg[Max[to[y]]^1]=1;ans-=W[Max[to[y]]];add2(1,to[y],W[y]);Max[to[y]]=W[y];dp(y,tot);}cout<<"Total miles driven: "<<ans<<endl;return 0;}
#include<cstdio>#include<cstring>#include<iostream>#include<map>#include<string>using namespace std;#define rep(i,j,k) for(i=j;i<=k;++i)#define per(i,j,k) for(i=j;i>=k;--i)#define sqr(x) ((x)*(x))#define G getchar()#define LL long long#define pii pair<int,int>#define mkp make_pair#define X first#define Y second#define N 1  #define inf 2139062143map<string,int>mp;LL ans;bool flg[N];int n,m,w[N][N],w2[N][N],vis[N],Min[N],mx[N],my[N],sz[N],blg[N],blk;int get(string s){map<string,int>::iterator ii=mp.find(s);return ii==mp.end()?mp[s]=++n:ii->Y;}void DFS(int x){int i;vis[x]=1;++sz[blg[x]=blk];rep(i,2,n)if(w[x][i]<inf&&!vis[i])DFS(i);}void Prim(int x){memset(Min,127,sizeof Min);int i,j=0,y,z;Min[x]=0;while(1){vis[x]=-1;if(++j==sz[blk])return;y=0;z=inf;rep(i,2,n)if(vis[i]>0)if((Min[i]=min(Min[i],w[x][i]))<z)z=Min[y=i];ans+=w2[x][y]=w2[y][x]=z;x=y;}}void dp(int x,int pre){int i;rep(i,2,n)if(w2[x][i]<inf&&i!=pre){if(w2[mx[x]][my[x]]>w2[x][i])mx[i]=mx[x],my[i]=my[x];else mx[i]=x,my[i]=i;dp(i,x);}}int main(){cout<<"Total miles driven: ";int x,y,z,i,j;string s1,s2;mp["Park"]=n=1;cin>>m;memset(w,127,sizeof w);while(m--){cin>>s1>>s2>>z;x=get(s1);y=get(s2);w[y][x]=w[x][y]=min(w[x][y],z);}memset(w2,127,sizeof w2);rep(i,2,n)if(!vis[i]){++blk;DFS(i);Prim(i);}memset(Min,0,sizeof Min);rep(i,2,n)if(w[1][i]<inf&&(!Min[blg[i]]||w[1][Min[blg[i]]]<w[1][i]))Min[blg[i]]=i;rep(i,1,blk)flg[Min[i]]=1,ans+=w2[1][Min[i]]=w[1][Min[i]];w2[0][0]=0;dp(1,0);cin>>m;for(m-=blk;m--;){x=y=0;rep(i,2,n)if(w[1][i]<inf&&!flg[i]&&w2[mx[i]][my[i]]-w[1][i]>x)x=w2[mx[i]][my[i]]-w[1][y=i];if(!y){cout<<ans<<endl;return 0;}flg[y]=1;w2[mx[y]][my[y]]=w2[my[y]][mx[y]]=inf;ans-=x;w2[1][y]=w[1][y];mx[y]=1;my[y]=y;dp(y,1);}cout<<ans<<endl;return 0;}
傻逼一样,就一个板题,硬说我MLE,重写还没用,扔了算了。

原创粉丝点击