差分约束+拓扑排序
第一次写差分约束,记录下。
代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define lson o<<1
#define rson o<<1|1
#define CLR(A, X) memset(A, X, sizeof(A))
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<int, double> PID;
const double eps = 1e-8;
int dcmp(double x){if(fabs(x)<eps) return 0; return x<0?-1:1;}
const int N = 1e2+5;
const double INF = 1e18;
const LL MOD = 1e9+7;
bool inq[N], boot[N];
int cnt[N], in[N];
double dis[N][N], d[N];
PII a[N];
map<string, int> ms;
map<int, string> person;
vector<PID> G[N];
vector<int> topu[N], ans;
bool SPFA(int s, int n) {
for(int i = 1; i <= n; i++) d[i] = INF, cnt[i] = 0, inq[i] = 0;
d[s] = 0; inq[s] = 1;
queue<int> Q;
Q.push(s);
while(!Q.empty()) {
int u = Q.front(); Q.pop();
inq[u] = 0;
for(PID x:G[u]) {
int v = x.fi;
if(dcmp(d[u]+x.se-d[v]) < 0) {
d[v] = d[u]+x.se;
if(!inq[v]) {
inq[v] = 1;
Q.push(v);
if(++cnt[v] > n) return true;
}
}
}
}
for(int i = 1; i <= n; i++) if(dcmp(d[i]) < 0) {
in[s]++;
topu[i].pb(s);
}
return false;
}
void solve(int n) {
for(int i = 1; i <= n; i++) if(SPFA(i, n)) {
puts("IMPOSSIBLE");
return;
}
queue<int> Q;
for(int i = 1; i <= n; i++) {
if(!in[i] && boot[i]) Q.push(i);
}
while(!Q.empty()) {
if(Q.size() > 1) {
puts("UNKNOWN");
return;
}
int u = Q.front(); Q.pop();
ans.pb(u);
for(int v:topu[u]) {
in[v]--;
if(!in[v]) Q.push(v);
}
}
for(int i = 0; i < ans.size(); i++) {
cout << person[ans[i]];
printf("%c", i==ans.size()-1?'\n':' ');
}
}
int main() {
int T;
cin >> T;
while(T--) {
ms.clear(); person.clear(); ans.clear();
int n, m; char s[25];
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%s%d%d", s, &a[i].fi, &a[i].se);
ms[(string)s] = i; person[i] = (string)s;
G[i].clear(); topu[i].clear(); in[i] = 0; boot[i] = 0;
for(int j = 1; j <= i; j++) {
dis[i][j] = dis[j][i] = sqrt(1.0*(a[i].fi-a[j].fi)*(a[i].fi-a[j].fi)+1.0*(a[i].se-a[j].se)*(a[i].se-a[j].se));
}
}
while(m--) {
scanf("%s", s);
int x = ms[(string)s];
scanf("%*s%s", s);
int v = ms[(string)s];
scanf("%*s%*s%s", s);
int u = ms[(string)s];
G[u].pb({v, dis[u][x]-dis[v][x]});
boot[v] = boot[u] = 1;
}
solve(n);
}
return 0;
}