2 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=110,M=210; const int inf=0x3f3f3f3f; struct node{ int x,y,c; }e[M]; struct edge{ int x,y,c,pre; }a[2*M]; int last[N],alen; void ins(int x,int y,int c){ a[++alen]=edge{x,y,c,last[x]}; last[x]=alen; } int vis[N][N],f[N]; int d[N],v[N],st,ed; void spfa(){ memset(d,0x3f,sizeof(d));d[st]=0; memset(v,0,sizeof(v));v[st]=1; queue<int>Q;Q.push(st); while(!Q.empty()){ int x=Q.front();Q.pop(); for(int k=last[x];k;k=a[k].pre){ int y=a[k].y; if(d[y]>d[x]+a[k].c){ d[y]=d[x]+a[k].c; if(!v[y]){ v[y]=1; Q.push(y); } } } v[x]=0; } } int main(){ int n,m,K,t; scanf("%d%d%d%d",&n,&m,&K,&t); for(int i=1;i<=t;i++){ scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].c); } for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ vis[i][j]=1; } } int q;scanf("%d",&q); for(int i=1;i<=q;i++){ int x,l,r; scanf("%d%d%d",&x,&l,&r); for(int j=l;j<=r;j++){ vis[x][j]=0; } } st=1,ed=m; memset(f,0x3f,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++){ int mn=inf; for(int j=0;j<i;j++){ alen=1;memset(last,0,sizeof(last)); for(int k=1;k<=t;k++){ int x=e[k].x,y=e[k].y,c=e[k].c; int bk=0; for(int l=j+1;l<=i;l++){ if(!vis[x][l]||!vis[y][l]){ bk=1; break; } } if(!bk){ ins(x,y,c),ins(y,x,c); } } spfa(); if(d[ed]!=inf){ mn=min(mn,f[j]+d[ed]*(i-j)+K); } } f[i]=mn; } printf("%d",f[n]-K); return 0; }
-
-1
#include<bits/stdc++.h> namespace zjy { inline void read(int &x) { x=0;int f=1;char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') { f=-1; ch=getchar(); } } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } x*=f; } struct EDGE { int nex,w,to; }edge[410]; int head[21],tot,dis[21]; inline void insert(int from,int to,int w) { edge[++tot].nex=head[from]; head[from]=tot; edge[tot].to=to; edge[tot].w=w; } struct POINT { int num; friend bool operator < (POINT a,POINT b) { return dis[a.num]<dis[b.num]; } }point[21]; int N,M,K,E,D; bool close[21][105],vis[21]; int cost[105][105]; std::priority_queue<std::pair<int,int> > que; void dijkstra(int l,int r) { memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); for(int x=1;x<=M;x++) for(int i=l;i<=r;i++) if(close[x][i]) { vis[x]=1; continue; } que.push(std::make_pair(0,1));dis[1]=0; while(!que.empty()) { int u=que.top().second; que.pop(); if(vis[u]) continue ; vis[u]=1; for(int i=head[u];i;i=edge[i].nex) { if(dis[edge[i].to]>dis[u]+edge[i].w) { dis[edge[i].to]=dis[u]+edge[i].w; que.push(std::make_pair(-dis[edge[i].to],edge[i].to)); } } } cost[l][r]=dis[M]; } int dp[105]; int work() { read(N);read(M);read(K);read(E); int x,y,z; for(int i=1;i<=E;i++) { read(x);read(y);read(z); insert(x,y,z); insert(y,x,z); } read(D); for(int i=1;i<=D;i++) { read(x);read(y);read(z); for(int i=y;i<=z;i++) close[x][i]=1; } for(int i=1;i<=N;i++) for(int j=i;j<=N;j++) dijkstra(i,j); memset(dp,0x3f,sizeof(dp)); dp[0]=-K; for(int i=1;i<=N;i++) for(int j=0;j<=i;j++) if(cost[j+1][i]!=0x3f3f3f3f&&dp[j]!=0x3f3f3f3f) dp[i]=std::min(dp[i],dp[j]+(i-j)*cost[j+1][i]+K); std::cout<<dp[N]; return 0; } } int main() { zjy::work(); return 0; }
- 1
信息
- ID
- 1003
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 95
- 已通过
- 45
- 上传者