日历
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 |
|
统计
- 随笔 - 23
- 文章 - 122
- 评论 - 31
- 引用 - 0
导航
常用链接
留言簿(2)
随笔档案(23)
文章分类(270)
文章档案(122)
我的豆瓣
搜索
最新评论
![](/images/xml.gif)
阅读排行榜
评论排行榜
|
去年武汉现场赛的题目,当时想法都对了死活没写出来,惭愧,其实很简单,判环还想复杂了,其实构造好图后就一个拓扑排序就行了。 解法:处理好一维的,三维就一样,什么bellmanford完全不用,直接拓扑排序。 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define M 500000
#define N 2005
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
struct edge
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
int ed;
edge *next;
}e[M], *head[4][N];
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int pos, in[4][N], queue[4][N], ans[4][N];
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
inline void Add(int type, int a, int b);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void Pre(int n)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
pos = 0;
memset(head, 0, sizeof(head));
memset(in, 0, sizeof(in));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= 3; j++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
Add(j, i, i + n);
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
inline void Add(int type, int a, int b)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
e[pos].ed = b, e[pos].next = head[type][a];
head[type][a] = &e[pos++];
in[type][b]++;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
bool TopSort(int type, int n)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
int front, top;
front = top = 0;
for(int i = 1; i <= 2 * n; i++)
if(!in[type][i])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
queue[type][top++] = i;
}
while(front < top)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
int u = queue[type][front++];
for(edge *p = head[type][u]; p; p = p->next)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
in[type][p->ed]--;
if(!in[type][p->ed])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
queue[type][top++] = p->ed;
}
}
}
return top == 2 * n;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void solve(int n)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
for(int i = 1; i <= 3; i++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
bool flag = TopSort(i, n);
if(!flag)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
puts("IMPOSSIBLE");
return;
}
}
puts("POSSIBLE");
for(int i = 0; i < 2 * n; i++)
for(int j = 1; j <= 3; j++)
ans[j][queue[j][i]] = i;
for(int i = 1; i <= n; i++)
printf("%d %d %d %d %d %d\n", ans[1][i], ans[2][i], ans[3][i],
ans[1][i + n], ans[2][i + n], ans[3][i + n]);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
int n, r, a, b, cas = 0;
char op[5];
while(scanf("%d %d", &n, &r), n + r)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
Pre(n);
while(r--)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
scanf("%s %d %d", &op, &a, &b);
if(op[0] == 'I')
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
for(int i = 1; i <= 3; i++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
Add(i, a, b + n);
Add(i, b, a + n);
}
}
else if(op[0] == 'X') Add(1, a + n, b);
else if(op[0] == 'Y') Add(2, a + n, b);
else if(op[0] == 'Z') Add(3, a + n, b);
}
printf("Case %d: ", ++cas);
solve(n);
puts("");
}
return 0;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
|