QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#58372 | #1774. Customs Controls | yzasaaa | WA | 2ms | 6548kb | C++ | 2.7kb | 2022-10-26 07:30:40 | 2022-10-26 07:30:43 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N=100010,M=100010*5;
int head[N],ver[M],edge[M],nxt[M],d[N],t[N];
int head2[N],ver2[M],nxt2[M];
bool v[N];
int n,m,k,tot,tot2;
priority_queue< pair<int,int> >q;
vector<int> pre[N];
vector<int> tmppath;
queue<int> q2;
int rudu[N],topperxu[N],num;
char ans[N];
void add(int x,int y,int z){
ver[++tot] = y,edge[tot] = z,nxt[tot] = head[x],head[x] = tot;
}
void add2(int x,int y){
ver2[++tot2] = y,nxt2[tot2] = head2[x],head2[x] = tot2;
}
void dfs(int v) {
if(v == 1) {
tmppath.push_back(v);
//for(int i = tmppath.size() - 1; i >= 0; i--)
//printf("%d ", tmppath[i]);
//printf("\n");
//½«ËùÓпÉÄܵÄ×î¶Ì·¹¹ÔìÓÐÏòÎÞ»·Í¼
int siz = tmppath.size();
for(int i=siz-1;i>0;--i){
add2(tmppath[i],tmppath[i-1]);
rudu[tmppath[i-1]]++;
}
tmppath.pop_back();
return;
}
tmppath.push_back(v);
for(int i = 0; i < (int)pre[v].size(); i++){
dfs(pre[v][i]);
}
tmppath.pop_back();
}
void dijkstra(){
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
d[1] = 0;
q.push(make_pair(0,1));
while(q.size()){
int x = q.top().second;
q.pop();
if(v[x]) continue;
v[x] = 1;
for(int i=head[x];i;i=nxt[i]){
int y = ver[i],z=edge[i];
if(d[y]>d[x]+z){
d[y] = d[x]+z;
q.push(make_pair(-d[y],y));
pre[y].clear();
pre[y].push_back(x);
}else{
if(d[y]==d[x]+z){
pre[y].push_back(x);
}
}
}
}
}
void topsort(){
q2.push(1);
while(!q2.empty()){
int u = q2.front();
q2.pop();
for(int i=head2[u];i;i=nxt2[i]){
int v = ver2[i];
if(--rudu[v]==0) q2.push(v);
}
topperxu[++num] = u;
//printf("%d ",u);
}
}
int main() {
//freopen("55.txt","r",stdin);
//freopen("hack2.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
if(n==2&&k==1){
printf("impossible");
return 0;
}
for(int i=1;i<=n;++i){
scanf("%d",&t[i]);
}
for(int i=1;i<=m;++i){
int x,y,z;
scanf("%d%d",&x,&y);
z = t[y];
add(x,y,z);
add(y,x,t[x]);
}
dijkstra();
dfs(n);
topsort();
//1ºÍnÖ±½ÓÏàÁ¬
if(num==2){
if(k>=num){
ans[1] = ans[n] = 1;
int tt = 2;
for(int i=2;i<n&&tt<=k;++i){
ans[i] = 1;
++tt;
if(tt==k) break;
}
}else{
if(k==1) ans[2] = 1;
}
}else{
if(k>num){
for(int i=1;i<=num;++i) ans[topperxu[i]] = 1;//±íʾU
int tt = num;
for(int i=1;i<=n&&tt<=k;++i){
if(!ans[i]){
ans[i] = 1;
++tt;
}
if(tt==k) break;
}
}else{
for(int i=1;i<=k;++i) ans[topperxu[i]] = 1;
}
}
for(int i=1;i<=n;++i){
printf("%c",ans[i]==1 ? 'N' : 'S');
}
return 0;
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 2ms
memory: 6548kb
input:
5 10 2 1 1 1 1 1 3 4 5 4 3 1 4 1 3 5 2 1 2 4 2 5 1 5 2 3
output:
NNSSN
result:
wrong answer number of N:s not equal to k