RT。求大佬分析一下。
代码:
//第一次:70pts TLE
//第二次:100pts AC
//c++14换成c++98就好了
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
char ch=getchar();
int x=0,f=1;
while((ch<'0'||ch>'9')&&ch!='-')
{
ch=getchar();
}
if(ch=='-') f=-1;
while(ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
struct node
{
int x,y;
};
int edge[2005][2005];
vector<node> v;
queue<int> q;
int vis[2005],x,y,z,sum,n,m,k,h,Q,ans,d[2005],player[2005];
int is_f[2005][2005];
inline bool cmp(node a,node b)
{
return edge[a.x][a.y]<edge[b.x][b.y];
}
inline bool check()
{
for(int i=1;i<=n;i++)
{
vis[i]=0;
}
while(!q.empty()) q.pop();
q.push(k);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(edge[x][i]!=0&&vis[i]==0&&is_f[x][i]==0)
{
if(player[i]==1)
{
return false;
}
q.push(i);
vis[i]=1;
}
}
}
return true;
}
inline void dfs(int x)
{
if(check())
{
ans=sum;
return ;
}
if(x>=v.size())
{
return ;
}
sum+=edge[v[x].x][v[x].y];
is_f[v[x].x][v[x].y]=1;
is_f[v[x].y][v[x].x]=1;
if(ans>sum)
{
dfs(x+1);
}
sum-=edge[v[x].x][v[x].y];
is_f[v[x].x][v[x].y]=0;
is_f[v[x].y][v[x].x]=0;
dfs(x+1);
}
int main()
{
ios::sync_with_stdio(false);
n=read();
m=read();
k=read();
for(int i=1;i<=m;i++)
{
x=read();
y=read();
z=read();
v.push_back((node){x,y});
edge[x][y]=edge[y][x]=z;
}
Q=read();
while(Q--)
{
int x;
x=read();
player[x]=1;
}
sort(v.begin(),v.end(),cmp);
for(int i=1;i<=n;i++)
{
if(edge[k][i]!=0) ans+=edge[k][i];
}
dfs(0);
printf("%d\n",ans);
return 0;
}