您的位置:首页 > 其它

[kuangbin带你飞]专题四 最短路练习 O LightOJ 1074

2016-10-13 21:34 309 查看
题目地址:https://vjudge.net/contest/66569#problem/O

思路:每条边的权值由起点与终点决定,我考虑到可能会有权值为负的边,所以这题我用的是spfa。没有什么坑,应该是我这两天写的唯一一道1Y的题目了……

AC代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=205;
int a[maxn];
vector<pair<int,int> >E[maxn];
int d[maxn];
bool vis[maxn];
int in[maxn];
int n,m,q;
void init()
{
for(int i=0;i<maxn;i++)
{
E[i].clear();
d[i]=INF;
a[i]=0;
vis[i]=false;
in[i]=0;
}
}

void spfa(int s)
{
queue<int>q;
vis[s]=true;
d[s]=0;
q.push(s);
while(!q.empty())
{
int now=q.front();
q.pop();
if(in[now]++>n)
return;
vis[now]=false;
for(int i=0;i<E[now].size();i++)
{
int v=E[now][i].first;
if(d[v]>d[now]+E[now][i].second)
{
d[v]=d[now]+E[now][i].second;
if(vis[v])
continue;
vis[v]=true;
q.push(v);
}
}

}
}

int main()
{
int t;
scanf("%d",&t);
for(int casei=1;casei<=t;casei++)
{
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int c,b;
scanf("%d%d",&c,&b);
int temp=(a[b]-a[c])*(a[b]-a[c])*(a[b]-a[c]);
E[c].push_back(make_pair(b,temp));
}
spfa(1);
scanf("%d",&q);
printf("Case %d:\n",casei);
while(q--)
{
int temp;
scanf("%d",&temp);
if(d[temp]==INF || d[temp]<3)
printf("?\n");
else
printf("%d\n",d[temp]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: