/**********************************************************************題意:有n個車站, 車站間為有向邊, 可能有重, 無自環;有軍隊要從1號站去n號站, 每條邊要走1分鐘;若炸掉一個車站則所有與此站相連的邊都不可走;問至少炸多少站使得軍隊到達n號站的時間超過k分鐘;分析:對於一條邊(u,v)dist[1][u]+dist[v][n]+1<=k;那麼如果當前1->u的最短路徑大於k則說明這條路徑上的點u、v可以暫時不予考慮即只需考慮 dist[1][u]+dist[v][n]+1<=k的情況,那麼根據dist重新構圖;滿足dist[1][u]+dist[v][n]+1<=k的點(u,v)就加入圖中;根據題意就是要保證這個圖不能連通,那麼求出這個圖的點連通度就OK了演算法:最短路的演算法幾個演算法在這個題上都可以用;但是又由於它資料的特殊性,即每條邊的權值為1;所以可以用bfs(相對於幾種最短路的演算法效率較高)來求每一次的最短路徑;然後用dfs實現刪除最短路徑上的點即可;**********************************************************************/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<vector>#include<queue>using namespace std;const int N=55;int dist[N];int map[N][N];bool visit[N];int n,m,k,tot;bool flag;queue<int> Q;vector<int> edge[N];void bfs(){ memset(dist,-1,sizeof(dist)); while(!Q.empty()) Q.pop(); Q.push(1); dist[1]=0; while(!Q.empty()) { int s=Q.front(); Q.pop(); for(int i=0; i<edge[s].size(); i++) { int x=edge[s][i]; if(!visit[x]&&dist[x]==-1) { Q.push(x); dist[x]=s; if(x==n) return ; } } }}void dfs(int x){ if(flag) return; bfs(); if(dist[n]==-1) { flag=1; return ; } int num=0; for(int i=n; i>1; i=dist[i]) { num++; map[x][num]=i; } if(num>k) { flag=1; return ; } if(x>tot) return; for(int i=2; i<=num; i++) { visit[map[x][i]]=1; dfs(x+1); visit[map[x][i]]=0; }}int solve(){ flag=0; for(int i=0; i<=n; i++) { tot=i; memset(visit,0,sizeof(visit)); dfs(1); if(flag) return i; } return n;}int main(){ //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin); while(~scanf("%d%d%d",&n,&m,&k)) { if(n+m+k==0) break; for(int i=0; i<=n; i++) edge[i].clear(); for(int i=0; i<m; i++) { int u,v; scanf("%d%d",&u,&v); edge[u].push_back(v); } printf("%d\n",solve()); } return 0;}