UVA663ソートスライド(迷惑スライド)
最初は、とても形而上学的な質問を行う(トポロジカルソートの章「を通じて情報オリンピック」でこの練習を見つけるためにしかし、彼らは標準プロセスが間違っていることがわかりました)、2部グラフマッチング結果を作りました
紫の疑問は、なぜ黒いの問題に関しては - こんにゃくは本当にアイデアが青について難しい質問ではない感じたいです。。
これは、UVA出力改行スペース万年古いクレーターからです
#include<cstdio>
#include<cstring>
using namespace std;
#define N 27
int vis[N],match[N],ans[N],x1[N],x2[N],y1[N],y2[N],n,T;
bool g[N][N],flag;
inline bool dfs(int x) {
for (register int i=1; i<=n; i++)
if (!vis[i] && g[x][i]) {
vis[i]=1;
if (!ans[i] || dfs(ans[i])) {
ans[i]=x;//第 i 个幻灯片对应数字为 x
return true;
}
}
return false;
}
inline int find() {//求二分图最大匹配
int sum=0;
memset(ans,0,sizeof ans);
for (register int x=1; x<=n; x++){
memset(vis,0,sizeof vis);
if (dfs(x)) sum++;// 总匹配数
}
return sum;
}
int main() {
while(~scanf("%d",&n) && n) {
printf("Heap %d\n",++T);
memset(g,0,sizeof g);
for (int i=1; i<=n; i++)
scanf("%d%d%d%d",&x1[i],&x2[i],&y1[i],&y2[i]);
for (int i=1,x,y; i<=n; i++) {
scanf("%d%d",&x,&y);
for (int j=1; j<=n; j++)
if (x>=x1[j] && x<=x2[j] && y>=y1[j] && y<=y2[j])
g[i][j]=1;//如果数字在幻灯片范围之内的话则连边,有机会匹配
}
int tot=find(),flag=0;
現在のマッチが決定されたが、プログラムはまだ、終わっていないので、もしこの答えで出力:
for (int i=1;i<=n;i++) printf("(%c,%d)",i-1+'A',ans[i]);
サンプルデータによると、あなたは第2セットのデータが状況の出力に一致する、何もないではありませんしながら、データの最初のセットは、正しい答えを持っています
対象要件があるためである。
状況はより多くの対応を表示された場合、我々はこの対応を実現することができません呼び出します。
データA及びBの第2のセットは、それが一意に対応していない、いずれか1及び2と一致しています
//接下来我们要去除这种情况
for (int j=1; j<=n; j++)
for (int i=1;i<=n; i++)
if (g[i][j]) {
g[i][j]=0;//考虑依次删去每条边,如果有唯一对应,那么至少有一边删去后使匹配数减少
if (find()!=tot) {
if (flag) printf(" ");
else flag=1;
printf("(%c,%d)",j-1+'A',i);//如果幻灯片 j 与 数字 i 是唯一搭配,直接输出
}
g[i][j]=1;
}
if (!flag) printf("none");//如果删去任意一边匹配数都不变,则对应不唯一
puts("\n");//相当于printf("\n\n");
}
return 0;
}
孟問題への新たな第一章黒の問題の解決策は、最初の問題への解決策に書いた問題の解決策ではない、第2のブラック・タイトルQWQ