您的位置:首页 > 编程语言 > PHP开发

kuangbin_ShortPath O (LightOJ 1074)

2016-01-14 00:07 585 查看
这是什么鬼OJ啊都没见过害的我还交错语言CE了一发摔

想着懒得重写了直接把上一题的dij改了改就交了 然后RE

反应过来这题有负环 想着怎么标记负环同时不直接结束spfa

看了别人的代码感叹了一下我还是太弱 多学习吧 =.=

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#define INF 0x3F3F3F3F
using namespace std;

int busy[210], val[210][210];
int t, n, m, q, dist[210];
bool cir[210];

void spfa(int s)
{
int time[210];
bool vis[210];
queue<int> q;
memset(vis, 0, sizeof vis);
memset(time, 0, sizeof time);
memset(dist, 0x3f, sizeof dist);

dist[s] = 0;
vis[s] = true;
q.push(s);
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
if(cir[u]) continue;
for(int i = 1; i <= n; i++){
if(dist[i] > dist[u] + val[u][i]){
dist[i] = dist[u] + val[u][i];
if(!vis[i]){
q.push(i);
if(time[i]++ > n) cir[i] = true;
}
}
}
}
}

int main()
{
scanf("%d", &t);
for(int i = 1; i <= t; i++){
memset(val, 0x3f, sizeof val);
memset(cir, 0, sizeof cir);

scanf("%d", &n);
for(int j = 1; j <= n; j++){
scanf("%d", &busy[j]);
}

scanf("%d", &m);
for(int j = 1; j <= m; j++){
int s, d;
scanf("%d%d", &s, &d);
val[s][d] = (int)pow(busy[d] - busy[s], 3);
}

spfa(1);
scanf("%d", &q);
printf("Case %d:\n", i);
while(q--){
int d;
scanf("%d", &d);
if(cir[d] || dist[d] < 3 || dist[d] == INF) puts("?");
else printf("%d\n", dist[d]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: