摧毁道路
题目描述:(暂不公开)
这道题的数据也是蛮有意思,有六十分是可以拿的。
但是自己写了六十分只拿到五十分。
主要是针对每个数据的弱点吧。
考场代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 3000;
const int INF = 0x3f3f3f3f;
inline int max(int a,int b) {
return a > b ? a : b; }
inline int min(int a,int b) {
return a < b ? a : b; }
inline void read(int &x)
{
char ch = getchar(); x = 0;
for(;ch < '0' || ch > '9';) ch = getchar();
for(;ch >= '0' && ch <= '9';) x = x * 10 + (ch ^ '0'), ch = getchar();
}
struct Edge{
int to,nxt,val,bz; } g[N << 1];
int last[N],cnt = 1;
int n,m,s1,t1,l1,s2,t2,l2,ans = -1;
int dis[N],dep[20],l,r,q[N << 2],vis[N],fa[N];
void add(int u,int v,int w) {
g[++cnt] = (Edge){
v,last[u],w,1 }, last[u] = cnt; }
void Add_Edge(int u,int v,int w) {
add(u,v,w), add(v,u,w); }
void work_dis()
{
memset(dis,INF,sizeof dis), dis[s1] = 0;
vis[q[l = r = 1] = s1] = 1;
for(;l <= r; ++ l)
{
for(int i = last[q[l]];i;i = g[i].nxt)
if(dis[g[i].to] > dis[q[l]] + g[i].val)
{
dis[g[i].to] = dis[q[l]] + g[i].val;
if(!vis[g[i].to]) vis[q[++r] = g[i].to] = 1;
}
vis[q[l]] = 0;
}
if(dis[t1] <= min(l1,l2