两份一模一样的代码,一份AC,一份RE是怎么回事
  • 板块灌水区
  • 楼主chenxsir
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/10/22 15:41
  • 上次更新2023/11/5 10:10:39
查看原帖
两份一模一样的代码,一份AC,一份RE是怎么回事
218223
chenxsir楼主2020/10/22 15:41

题目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;
}
2020/10/22 15:41
加载中...