比赛 |
防止isaac的小练习day2 |
评测结果 |
AAAAAAAAA |
题目名称 |
道路重建 |
最终得分 |
100 |
用户昵称 |
Mealy |
运行时间 |
0.017 s |
代码语言 |
C++ |
内存使用 |
0.34 MiB |
提交时间 |
2016-11-02 10:13:44 |
显示代码纯文本
#include <cstdio>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
const int nmax=186;
const int INF=1<<29;
int n,m;
int tmpfrom,tmpto,tmplen;
int d;
int des[nmax][nmax]={0};
int dis[nmax]={0};
class edge
{
public:
int from,to;
int len;
int ext;
};
int start,end;
vector<edge> G[nmax];
class SSSPFA
{
public:
bool inqueue[nmax];
queue<int > Q;
void SPreDo(int tmps)
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
}
dis[tmps]=0;
memset(inqueue,0,sizeof(inqueue));
Q.push(tmps);
inqueue[tmps]=1;
}
void SPFA(int tmps)
{
SPreDo(tmps);
while(!Q.empty())
{
int tmpx=Q.front();
Q.pop();
inqueue[tmpx]=0;
for(int i=0;i<G[tmpx].size();i++)
{
int tmpv=G[tmpx][i].to;
if(dis[tmpv]>dis[tmpx]+G[tmpx][i].ext)
{
dis[tmpv]=dis[tmpx]+G[tmpx][i].ext;
if(!inqueue[G[tmpx][i].to])
{
inqueue[G[tmpx][i].to]=1;
Q.push(G[tmpx][i].to);
}
}
}
}
}
}FJ;
void PreDo()
{
freopen("rebuild.in","r",stdin);
freopen("rebuild.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&tmpfrom,&tmpto,&tmplen);
G[tmpfrom].push_back((edge){tmpfrom,tmpto,tmplen,0});
G[tmpto].push_back((edge){tmpto,tmpfrom,tmplen,0});
}
scanf("%d",&d);
for(int i=1;i<=d;i++)
{
scanf("%d%d",&tmpfrom,&tmpto);
des[tmpfrom][tmpto]=1;
des[tmpto][tmpfrom]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<G[i].size();j++)
{
edge& e=G[i][j];
if(des[e.from][e.to]==1)
{
e.ext=e.len;
}
}
}
scanf("%d%d",&start,&end);
}
int main()
{
PreDo();
FJ.SPFA(start);
printf("%d\n",dis[end]);
return 0;
}