蜜汁RE求助
查看原帖
蜜汁RE求助
912241
dream_on_screen楼主2023/8/30 13:15

在本地测试的时候运行都成功了,但是到洛谷上评测的时候却不知道为什么有一半RE了

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
class graph
{
    template <class type>
    struct node
    {
        int id;
        type dis;
        bool operator < (node other) const
        {
            return this->dis>other.dis;
        }
    };
    public:
        const long long inf=1e16;
        template<class type>
		vector<type> dij(int n,int l,vector<vector<type>>e,vector<vector<type>>w)
        {
            type dis[n+5];
            for(int i=1;i<=n;i++)
                dis[i]=inf;
            dis[l]=0;
            bool vis[n+5]={};
            priority_queue<node<type>>q;
            node<type>temp;
            temp.id=l;
            temp.dis=0;
            q.push(temp);
            while(q.size()!=0)
            {
                int t=q.top().id;
                q.pop();
                if(vis[t])
                    continue;
                vis[t]=true;
                for(int i=0;i<e[t].size();i++)
                {
                    int u=e[t][i];
                    if(dis[u]>dis[t]+w[t][i])
                    {
                        dis[u]=dis[t]+w[t][i];
                        node<type>next;
                        next.id=u;
                        next.dis=dis[u];
                        q.push(next);
                    }
                }
            }
            vector<type>ans;
            ans.push_back(0);
            for(int i=1;i<=n;i++)
                ans.push_back(dis[i]);
            return ans;
        }
};
template <class type>
vector<type> dij(int n,int l,vector<vector<type>>e,vector<vector<type>>w)
{
    graph g;
    return g.dij(n,l,e,w);
}
int n,m;
//1红色2黄色 
int c[128][128];
vector<vector<int>> e,w;
inline int id(int x,int y,int c){return x*(n+1)+y+c*(n+1)*(n+1);}
inline void add(int lx,int ly,int lc,int rx,int ry,int rc,int s)
{
	e[id(lx,ly,lc)].push_back(id(rx,ry,rc));
	w[id(lx,ly,lc)].push_back(s); 
}
int main()
{
	cin>>m>>n;
	e.resize(49152);
	w.resize(49152);
	for(int i=1;i<=n;i++)
	{
		int u,v,t;
		cin>>u>>v>>t;
		c[u][v]=t+1;
	}
	//建边
	for(int i=1;i<=m;i++)
		for(int j=1;j<=m;j++)
		{
			int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
			for(int k=1;k<=4;k++)
			{
				int x=i+dx[k],y=j+dy[k];
				if(c[i][j]==0&&c[x][y]!=0)
				{
					add(i,j,c[x][y],x,y,c[x][y],0);
					add(i,j,3-c[x][y],x,y,c[x][y],1);
				}
				if(c[i][j]!=0)
				{
					if(c[x][y]!=0)
					{
						int s=0;
						if(c[i][j]!=c[x][y])
							s=1;
						add(i,j,c[i][j],x,y,c[x][y],s);
					}
					else
					{
						add(i,j,c[i][j],x,y,c[i][j],2);
						add(i,j,c[i][j],x,y,3-c[i][j],3);
					}
				}
			}
		}
	vector<int> dis=dij(id(m,m,2),id(1,1,c[1][1]),e,w);
	int ans=0x3f3f3f3f;
	for(int i=0;i<=2;i++)
		ans=min(ans,dis[id(m,m,i)]);
	if(ans!=0x3f3f3f3f)
		cout<<ans;
	else
		cout<<-1;
	return 0;
}

最后我下载了一个RE的评测点数据,但是本地也运行成功并得到了正确的答案

#8 input:

7 16
1 1 1
1 3 1
2 6 0
2 4 1
3 6 1
4 4 0
4 7 1
4 3 1
5 7 1
5 5 0
5 6 1
6 5 0
6 1 1
7 6 0
7 7 0
7 2 1

except:

11
2023/8/30 13:15
加载中...