题目链接:点击打开链接
题目大意:略。
解题思路:考虑起始点 -1 的情况 + 无用点的情况。小技巧:通过优先级(题目分类) + 标号(稳定排序)。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); #define INF 0x3f3f3f3f #define MOD 1000000007 using namespace std; typedef long long ll; const int maxn=1e5+10; int da[maxn], nx[maxn]; struct node { int id,da,pri,mark; }nds[maxn]; int cmp(node n1, node n2) { if(n1.pri==n2.pri) return n1.mark<n2.mark; return n1.pri<n2.pri; } int main() { int n,id,s,k; scanf("%d%d%d",&s,&n,&k); for(int i=0;i<n;i++) { scanf("%d",&id); scanf("%d%d",&da[id],&nx[id]); } int l=0, w; while(s!=-1) { w=da[s]; nds[l].da=w, nds[l].id=s, nds[l].mark=l; if(w<0) nds[l].pri=1; else if(w>=0 && w<=k) nds[l].pri=2; else nds[l].pri=3; l++; s=nx[s]; } sort(nds,nds+l,cmp); for(int i=0;i<l-1;i++) { printf("%05d %d %05d\n",nds[i].id,nds[i].da,nds[i+1].id); } if(l>0) printf("%05d %d -1\n",nds[l-1].id,nds[l-1].da); return 0; }