在本地测试的时候运行都成功了,但是到洛谷上评测的时候却不知道为什么有一半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