题目链接:http://poj.org/problem?id=3259
题意:给一个有n个点的图,这些点之间有m条双向的正权值边(两点之间最多一条),还有w条单向的负权值边(权值以正数给出)。判断是否存在负权值回路。
思路:SPFA,判断是否有点出现了超过n次。
注意图是连通的,不用对每一个点都来一次SPFA(这样可能超时)。没有太多坑点,,然而我做的时候死的很惨。。。。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define M 6000
#define N 6005
#define INF 1000000000
struct node
{
int to, val;
node * next;
};
node * eg[M];
int n, m, w, flog;
int vis[N], cnt[N], dist[N];
void SPFA(int v)
{
queue<int> q;
node * p;
memset(vis, 0, sizeof(vis));
memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= m + w; i++)
{
if (i == v)
dist