经过严密的推证,缩小范围,结果居然是!?

P2176 [USACO11DEC] RoadBlock S / [USACO14FEB]Roadblock G/S

算出了$d[i]$偏大
by 小元勋 @ 2019-08-16 20:18:41


``` #include <bits/stdc++.h> using namespace std; #define maxn 110 #define maxm 5010 #define INF 2139062143 int ans=0,maxd=0,can[maxm],pre_u[maxn],pre_e[maxn],vis[maxn],d[maxn],n,m,head[maxn],size=1; struct edge { int v,w,nxt; }e[maxm<<1]; struct hepnode { int pos,dis; bool operator < (const hepnode& rhs) const { return dis > rhs.dis; } }; inline void init_() { freopen("a.txt","r",stdin); } inline int read_() { int x=0,f=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); } return x*f; } inline void clean_() { memset(head,-1,sizeof(head)); } inline void add_(int u,int v,int w) { e[++size].v=v; e[size].w=w; e[size].nxt=head[u]; head[u]=size; } inline void Dijkstra_first_(int s) { memset(d,0x7f,sizeof(d)); memset(vis,0,sizeof(vis)); d[s]=0; queue<hepnode>q; q.push((hepnode) {s,d[s]} ); while(!q.empty()) { hepnode pdc=q.front(); q.pop(); int u=pdc.pos; if(vis[u]) continue; vis[u]=1; for(int i=head[u];~i;i=e[i].nxt) { int v=e[i].v,w=e[i].w; if(d[v]==INF||d[v]>d[u]+w) { d[v]=d[u]+w; pre_u[v]=u;pre_e[v]=i; q.push((hepnode) {v,d[v]} ); } } } ans=d[n]; } inline void Dijkstra_(int s) { memset(d,0x7f,sizeof(d)); memset(vis,0,sizeof(vis)); d[s]=0; queue<hepnode>q; q.push((hepnode) {s,d[s]} ); while(!q.empty()) { hepnode pdc=q.front(); q.pop(); int u=pdc.pos; if(vis[u]) continue; vis[u]=1; for(int i=head[u];~i;i=e[i].nxt) { int v=e[i].v,w=e[i].w; if(d[v]==INF||d[v]>d[u]+w) { d[v]=d[u]+w; q.push((hepnode) {v,d[v]} ); } } } maxd=max(maxd,d[n]); // printf("%d\n",maxd); } void readda_() { n=read_();m=read_(); clean_(); int x,y,z; for(int i=1;i<=m;++i) { x=read_();y=read_();z=read_(); add_(x,y,z);add_(y,x,z); } Dijkstra_first_(1); int cnt=0; for(int i=n;i!=1;i=pre_u[i]) { can[++cnt]=pre_e[i]; } for(int i=1;i<=cnt;++i) { int b=e[can[i]].w; e[can[i]].w*=2; e[can[i]^1].w*=2; // printf("%d %d \n",can[i],e[can[i]].w); Dijkstra_(1); e[can[i]].w/=2; e[can[i]^1].w/=2; // printf("%d %d \n",can[i],e[can[i]].w); } printf("%d",maxd-ans); } int main() { init_(); readda_(); return 0; } ```
by 小元勋 @ 2019-08-16 20:18:57


但我真没查出错,我太难了
by 小元勋 @ 2019-08-16 20:19:24


太难了
by 小元勋 @ 2019-08-16 20:25:24


我太难了
by 小元勋 @ 2019-08-16 20:30:15


您太~~男♂~~强了
by oyblxzd @ 2019-08-16 20:53:50


@[何元勋](/space/show?uid=109427) 哇,神元勋!orz!
by Social_Zhao @ 2019-10-02 11:03:26


|