小l那沒出息的兒子當上了乙個公交司機。
每個司機都有乙個牌子,牌子的正面標出了這個司機所開的線路號。另外一面則隨便寫了乙個號碼。但是,當小l的兒子拿到他的牌子時,卻發現牌子的兩面都不是他開的線路號,所以他決定跟其他人換。(真笨~不會找領導嗎?)當然,所有的司機都只有當小l的兒子手裡的牌子的某一面上寫了自己的線路號時才願意跟他換,所以,小l想知道自己的兒子至少要換幾次牌子才能換到一張寫有自己線路號的牌子。小l很急,所以他就拜託你去幫他了。
輸入格式:
第一行包含乙個整數k ,表示車的數量。(小l的車除外)這些車的編號依次從1到k。
接下來的k行,每行包括此車對應的線路號和牌子另一面的號碼(該號碼是乙個長整型範圍內的數字)。
最後一行是安排小l開的公交車線路號以及給他的牌子上的號碼。
輸出格式:
輸出檔案只有1行,是最少交換次數m。
如果沒有方案,則輸出」impossible」(引號不要輸出)。
輸入樣例#1:
48 55 4
7 41 5
4 1 8
輸出樣例#1:
2
k<=1000。
資料保證線路號之間不重複。
公升級版
【輸出】
首行是最少交換的次數m,接下來的m行順序輸出要交換牌子的車的編號。如果沒有方案,則輸出impossible。
題解我們分別叫正面和背面a和b。兩個點有邊的條件是,a1=a2且b1=b2 或 a1=b2且b1=a2。
求出以n為源點的最短路,列舉每乙個點。因為前面的交換都不需要滿足路人丁,最後一次需要滿足,所以最後一次要判斷一下是否能夠滿足丁,然後找出最小值輸出。
#include #include#include
long dist[1010
];
bool used[1010
];
long a[1010
];
long b[1010
];
struct
node
; node* head[1010
];
long g[1010
];
long
n;
/*void output(long l)
*/void
dijkstra()
} used[u] = true
;
for (node* vv=head[u];vv;vv=vv->nxt)
} }
} long
getint()
do rs=(rs<<3)+(rs<<1)+tmp-'0'
;
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
} void insert(long a,long
b)
intmain()
long des =getint();
n ++;
a[n] =getint();
b[n] =getint();
for (long i=1;i1;i++)
} }
dijkstra();
long ans = 0x7f7f7f7f
;
long mov = 0
;
for (long i=1;i)
if (a[i]==des||b[i]==des)
if (dist[i] if (ans == 0x7f7f7f7f
) printf(
"impossible
");
else
return
0;
}
快十倍的**:
# include # include# include
using
namespace
std;
struct
node
a[2000
];int visit[2000],q[2000],time1[2000],c[2000
];int
main()
}f=1
;
while (f<=r)
}f++;
}cout
<<"
impossible
"
}