题目p1172
试了好几次都是这样,虚心求教
AC代码
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=110,M=110;
int n,m,k,e,t,cl[N][N],cant_vis[M];
ll dp[N*N],co[N][N],dis[M];
struct pp
{
int to,w;
};
pp m_p(int to, int w)
{
pp a; a.to=to; a.w=w;
return a;
}
bool operator <(const pp &a, const pp &b)
{
return a.w>b.w;
}
vector<pp>g[M];
int dij()
{
int book[N];
memset(book,0,sizeof book);
for(int i=1; i<=m; i++) dis[i]=100000000;
priority_queue<pp> q;
q.push(m_p(1,0)); dis[1]=0;
while(q.size())
{
int u=q.top().to; q.pop();
if(book[u]) continue; book[u]=1;
for(int i=0; i<g[u].size(); i++)
{
int v=g[u][i].to,d=g[u][i].w;
if(cant_vis[v]) continue;
if(dis[v]>dis[u]+g[u][i].w)
{
dis[v]=dis[u]+g[u][i].w;
q.push(m_p(v,dis[v]));
}
}
}
}
int main()
{
cin>>n>>m>>k>>e;
for(int i=1; i<=e; i++)
{
int a,b,d; cin>>a>>b>>d;
g[a].push_back(m_p(b,d));
g[b].push_back(m_p(a,d));
}
cin>>t;
for(int i=1; i<=t; i++)
{
int p,x,y; cin>>p>>x>>y;
for(int j=x; j<=y; j++) cl[p][j]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
memset(cant_vis,0,sizeof(cant_vis));
for(int r=i;r<=j;r++)
for(int l=1;l<=m;l++)
if(cl[l][r]) cant_vis[l]=1;
dij();
co[i][j]=dis[m]; //if(j>=i)cout<<dis[m]<<endl;
}
memset(dp,0x7f,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i]=(ll)co[1][i]*i;
for(int j=i-1;j>=0;j--)
dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k);
}
cout<<dp[n];
return 0;
}
RE代码
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=110,M=110;
int n,m,k,e,t,cl[N][N],cant_vis[M];
ll dp[N*N],co[N][N],dis[M];
struct pp
{
int to,w;
};
pp m_p(int to, int w)
{
pp a; a.to=to; a.w=w;
return a;
}
bool operator <(const pp &a, const pp &b)
{
return a.w>b.w;
}
vector<pp>g[M];
int dij()
{
int book[N];
memset(book,0,sizeof book);
for(int i=1; i<=m; i++) dis[i]=100000000;
priority_queue<pp> q;
q.push(m_p(1,0)); dis[1]=0;
while(q.size())
{
int u=q.top().to; q.pop();
if(book[u]) continue; book[u]=1;
for(int i=0; i<g[u].size(); i++)
{
int v=g[u][i].to,d=g[u][i].w;
if(cant_vis[v]) continue;
if(dis[v]>dis[u]+g[u][i].w)
{
dis[v]=dis[u]+g[u][i].w;
q.push(m_p(v,dis[v]));
}
}
}
}
int main()
{
cin>>n>>m>>k>>e;
for(int i=1; i<=e; i++)
{
int a,b,d; cin>>a>>b>>d;
g[a].push_back(m_p(b,d));
g[b].push_back(m_p(a,d));
}
cin>>t;
for(int i=1; i<=t; i++)
{
int p,x,y; cin>>p>>x>>y;
for(int j=x; j<=y; j++) cl[p][j]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
memset(cant_vis,0,sizeof(cant_vis));
for(int r=i;r<=j;r++)
for(int l=1;l<=m;l++)
if(cl[l][r]) cant_vis[l]=1;
dij();
co[i][j]=dis[m]; //if(j>=i)cout<<dis[m]<<endl;
}
memset(dp,0x7f,sizeof(dp));
for(int i=1;i<=n;i++){
dp[i]=(ll)co[1][i]*i;
for(int j=i-1;j>=0;j--)
dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k);
}
cout<<dp[n];
return 0;
}