| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
MLE是什么操作?????#include<map>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=25,maxm=500;
int n=0,m,s,ans;
map<string,int> id;
struct E{int x,y,c,v;}e[maxm];
bool cmp(E e1,E e2)
{
return e1.c<e2.c;
}
int D[maxn][maxn];
int belong[maxn];int scc=0;
void dfs(int x)
{
for(int y=1;y<=n;y++) if(D[x][y])
{
if(belong[y] || y==1) continue;
belong[y]=belong[x];
dfs(y);
}
}
int fa[maxn];
int find_fa(int x)
{
if(fa[x]==x) return x;
return fa[x]=find_fa(fa[x]);
}
int cnt;
bool link[maxn];
void kruskal()
{
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
if(e[i].x==1)
{
if(!link[belong[e[i].y]])
{
link[belong[e[i].y]]=true;
e[i].v=true;cnt++;
D[e[i].y][1]=D[1][e[i].y]=e[i].c;
ans+=e[i].c;
}
continue;
}
int fx=find_fa(e[i].x),fy=find_fa(e[i].y);
if(fx==fy) continue;fa[fx]=fy;//debug
e[i].v=true;
D[e[i].x][e[i].y]=D[e[i].y][e[i].x]=e[i].c;
ans+=e[i].c;
}
}
bool find(int x,int &fx,int &fy,int &mx)
{
for(int y=1;y<=n;y++) if(~D[x][y])
{
if(y==1)
{
mx=D[x][y];fx=x;fy=y;
return true;
}
if(find(y,fx,fy,mx))//
{
if(D[x][y]>mx)
{
mx=D[x][y];fx=x;fy=y;
}
return true;
}
}
return false;
}
string na1,na2;
int main()
{
id["Park"]=++n;
cin>>m;
memset(D,0,sizeof(D));//这里的D用来记录是否有边相连
for(int i=1;i<=m;i++)
{
cin>>na1>>na2>>e[i].c;
if(id.find(na1)==id.end()) id[na1]=++n;e[i].x=id[na1];
if(id.find(na2)==id.end()) id[na2]=++n;e[i].y=id[na2];
D[e[i].x][e[i].y]=D[e[i].y][e[i].x]=1;//debug 双向边
if(e[i].x>e[i].y) swap(e[i].x,e[i].y);
}
cin>>s;
for(int i=1;i<=m;i++) if(e[i].x==1)
{
int y=e[i].y;
if(belong[y]) continue;//debug
belong[y]=++scc;
dfs(y);
}
ans=cnt=0;
memset(link,false,sizeof(link));
memset(D,-1,sizeof(D));//这里的D[x][y]表示最小生成树中有没有选D[x][y]这条边,有则为其边权
kruskal();
for(int i=s-cnt;i>=1;i--)
{
int mx=0,nx,ny,nk;
for(int j=1;j<=m;j++)
{
if(e[j].v || e[j].x!=1) continue;
int fx,fy,fmx=-1;
find(e[j].y,fx,fy,fmx);
if(fmx-e[j].c>mx)
{
mx=fmx-e[j].c;
nx=fx;ny=fy;nk=j;
}
}
if(mx==0) break;
ans-=mx;
/*D[nx][ny]=-1;
D[e[nk].x][e[nk].y]=e[nk].c;debug*/
e[nk].v=true;
D[nx][ny]=D[ny][nx]=-1;
D[e[nk].x][e[nk].y]=D[e[nk].y][e[nk].x]=e[nk].c;
}
printf("Total miles driven: %d\n",ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator