社区讨论
萌新求助,刚学OI,妹子,单身
P1027[NOIP 2001 提高组] Car 的旅行路线参与者 18已保存回复 17
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 17 条
- 当前快照
- 1 份
- 快照标识符
- @mi6zh83k
- 此快照首次捕获于
- 2025/11/20 13:21 4 个月前
- 此快照最后确认于
- 2025/11/20 15:46 4 个月前
求助!
www我超正经的。这个题,用dijkstra过了,用spfa WA了,怎么回事啊emmm是写错了吗
(还有这份代码开C++11会WA,我也不知道为什么)
CPP#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#define M(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn=440;
int t,n,c0,a,b,cnt;
int c[maxn],vis[maxn];
int x[maxn][5],y[maxn][5];
double d[maxn];
int head[maxn];
double ans=99999999.99999;
struct edge{
int v,nxt;
double w;
}e[maxn*maxn*12];
double dist(int ax,int bx,int ay,int by){
return sqrtf((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}
void add_edge(int u,int v,double w){
++cnt;
e[cnt].v=v;
e[cnt].nxt=head[u];
e[cnt].w=w;
head[u]=cnt;
}
void dijkstra() {
bool vis[maxn];
priority_queue<pair<double,int>,vector<std::pair<double,int> >,greater<pair<double,int> > > q;
memset(d,127,sizeof(d));
memset(vis,0,sizeof(vis));
d[a]=0;q.push(std::make_pair(d[a],a));
d[a+n*1]=0;q.push(std::make_pair(d[a+n*1],a+n*1));
d[a+n*2]=0;q.push(std::make_pair(d[a+n*2],a+n*2));
d[a+n*3]=0;q.push(std::make_pair(d[a+n*3],a+n*3));
while(!q.empty()) {
int u=q.top().second;
q.pop();
vis[u]=true;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(vis[v]) continue;
if(d[v]>d[u]+e[i].w) {
d[v]=d[u]+e[i].w;
q.push(std::make_pair(d[v],v));
}
}
}
ans=min(ans,d[b]);
ans=min(ans,d[b+n*1]);
ans=min(ans,d[b+n*2]);
ans=min(ans,d[b+n*3]);
}
void spfa(){
for(int i=1;i<=n*4;i++){
d[i]=99999999.99999,vis[i]=0;
}
queue<int> q;
d[a+n*1]=0;vis[a+n*1]=1;q.push(a+n*1);
d[a+n*2]=0;vis[a+n*2]=1;q.push(a+n*2);
d[a+n*3]=0;vis[a+n*3]=1;q.push(a+n*3);
d[a]=0;vis[a]=1;q.push(a);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(vis[v])continue;
if(d[v]>d[u]+e[i].w){
d[v]=d[u]+e[i].w;
if(!vis[v]){
vis[v]=1;q.push(v);
}
}
}
vis[u]=0;
}
ans=min(ans,d[b]);
ans=min(ans,d[b+n*1]);
ans=min(ans,d[b+n*2]);
ans=min(ans,d[b+n*3]);
}
void get_4th(int xa, int ya, int xb, int yb, int xc, int yc, int i) {
int ab=(xa-xb)*(xa-xb)+(ya-yb)*(ya-yb),
ac=(xa-xc)*(xa-xc)+(ya-yc)*(ya-yc),
bc=(xb-xc)*(xb-xc)+(yb-yc)*(yb-yc);
int xd,yd;
if (ab+ac==bc) xd=xb+xc-xa, yd=yb+yc-ya;
if (ab+bc==ac) xd=xa+xc-xb, yd=ya+yc-yb;
if (ac+bc==ab) xd=xa+xb-xc, yd=ya+yb-yc;
x[i][3]=xd;y[i][3]=yd;
}
void work(){
ans=99999999.99999;
scanf("%d%d%d%d",&n,&c0,&a,&b);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d%d%d%d",&x[i][0],&y[i][0],&x[i][1],&y[i][1],&x[i][2],&y[i][2],&c[i]);
get_4th(x[i][0],y[i][0],x[i][1],y[i][1],x[i][2],y[i][2],i);
for(int j=0;j<4;j++){
for(int k=0;k<=3;k++)if(k!=j){
add_edge(i+n*j,i+n*k,dist(x[i][j],x[i][k],y[i][j],y[i][k])*c[i]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)if(i!=j){
for(int k=0;k<=3;k++){
for(int l=0;l<=3;l++){
add_edge(i+n*k,j+n*l,dist(x[i][k],x[j][l],y[i][k],y[j][l])*c0);
}
}
}
}
dijkstra();
printf("%.1lf\n",ans);
}
int main(){
#ifdef LOCAL
freopen("1.in","r",stdin);
#endif
scanf("%d",&t);
while(t--){
M(e);
M(x),M(y);
work();
}
}
回复
共 17 条回复,欢迎继续交流。
正在加载回复...