(这题 好水啊 好水啊 好水啊 好水啊!)
(话说这两天切的题越来越水了呢!)
(貌似网上的题解都是并查集?)
使用前缀和维护,有:
(不要随便看代码,不要随便看代码,不要随便看代码。因为很重要说以说三遍)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
const char *YES = "true";
const char *NO = "false";
//Global Variables & Definitions
#define MS(arr, x) memset(arr, x, sizeof(arr))
int w;
int n, m;
//End Global Variables & Definitions
//SPFA
#define S 105
int dis[110];
int inq[110];
int inc[110];
struct edge {
int v, w, next;
} e[3030];
int ecnt;
int h[110];
void init_edge() {
MS(h, ecnt = -1);
}
void adde(int u, int v, int w) {
++ecnt;
e[ecnt].v = v;
e[ecnt].w = w;
e[ecnt].next = h[u];
h[u] = ecnt;
}
queue<int> q;
bool spfa() {
int v;
while(!q.empty()) q.pop();
MS(dis, 0x80); MS(inq, 0); MS(inc, 0);
dis[S] = 0; inq[S] = inc[S] = 1;
q.push(S);
while(!q.empty()) {
int temp = q.front(); q.pop();
inq[temp] = 0;
for(int i = h[temp];~i;i = e[i].next) if(dis[v = e[i].v] < dis[temp] + e[i].w) {
dis[v] = dis[temp] + e[i].w;
if(!inq[v]) {
if(inc[v] >= n) return false;
++inc[v];
inq[v] = 1;
q.push(v);
}
}
}
return true;
}
//End SPFA
//Main Structure
const char* solve() {
init_edge();
scanf("%d%d", &n, &m);
int s, t, v;
for(int i = 0;i < m;++i) {
scanf("%d%d%d", &s, &t, &v);
adde(t, s - 1, -v);
adde(s - 1, t, v);
}
for(int i = 0;i <= n;++i) adde(S, i, 0);
return spfa() ? YES : NO;
}
inline void g_ir() {
scanf("%d", &w);
}
int main() {
g_ir();
while(w--) puts(solve());
return 0;
}
话说现在看十年以前的省选,NOI,CTSC,IOI的题都好水啊。只有OI的知识更新换代那么快么?