結果
| 問題 |
No.1640 簡単な色塗り
|
| コンテスト | |
| ユーザー |
tpc011854
|
| 提出日時 | 2021-08-06 22:27:21 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,036 bytes |
| コンパイル時間 | 315 ms |
| コンパイル使用メモリ | 50,688 KB |
| 実行使用メモリ | 15,744 KB |
| 最終ジャッジ日時 | 2024-06-29 15:32:15 |
| 合計ジャッジ時間 | 7,482 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 WA * 23 RE * 2 |
ソースコード
#include <cstdio>
#include <vector>
using std::vector;
int a[100005], b[100005];
struct Edge {
int u, v;
int id;
};
vector<Edge> g[100005];
int color[100005];
int cnt[100005];
int vis[100005];
Edge c[100005];
int stack[100005]; int top = 0;
void dfs(int u){
stack[++top] = u;
vis[u] = 1;
for(Edge e: g[u]){
int v = e.v;
if(!vis[v]){
//color[id] = v;
dfs(v);
}
}
}
void dfs1(int u){
vis[u] = 1;
for(Edge e: g[u]){
int v = e.v, id = e.id;
if(!color[id] && !vis[v]){
color[id] = v;
vis[v] = 1;
dfs1(v);
}
}
}
int main(){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d%d",&a[i],&b[i]);
cnt[a[i]]++;
cnt[b[i]]++;
}
for(int i = 1; i <= n; i++){
if(cnt[a[i]]==1){
color[i] = a[i];
vis[a[i]] = 1;
dfs1(a[i]);
}
else if(cnt[b[i]]==1){
color[i] = b[i];
vis[b[i]] = 1;
dfs1(a[i]);
}
else if(a[i]==b[i]){
color[i] = b[i];
vis[b[i]] = 1;
dfs1(a[i]);
}
else{
g[a[i]].push_back(Edge{a[i], b[i],i});
g[b[i]].push_back(Edge{b[i], a[i],i});
}
}
for(int i = 1; i <= n; i++){
if(!vis[i]){
int find = -1;
int u = i;
for(Edge e: g[u]){
if(!color[e.id]){
find = e.id;
break;
}
}
if(find==-1){
break;
}
else{
top = 0;
//printf("find = %d: %d %d\n",find,a[find],b[find]);
color[find] = a[find];
dfs(a[find]);
int bad = 0;
for(int j = 1; j <= top; j++){
if(!vis[stack[j]]) bad = 1;
vis[stack[j]] = 0;
}
if(bad){
top = 0;
//printf("haha\n");
color[find] = b[find];
dfs(b[find]);
int bb = 0;
for(int j = 1; j <= top; j++){
if(!vis[stack[j]]){
//printf("now = %d\n",stack[j]);
bb = 1;
}
vis[stack[j]] = 0;
}
if(bb) break;
else dfs1(b[find]);
}
else dfs1(a[find]);
}
}
}
int find = 0;
for(int i = 1; i <= n; i++) if(!vis[i]) find = 1;
if(find) printf("No\n");
else{
printf("Yes\n");
for(int i = 1; i <= n; i++) printf("%d\n",color[i]);
}
return 0;
}
tpc011854