題意:有n個任務:開始時間、起始地點、終止地點。每個地點可以派出一輛計程車,如果計程車完成任務i後還可以到達任務j,那麼它可以繼續執行任務j。現在問最少可以排除多少輛計程車?
演算法:1、最小路徑覆蓋
2、在無圈有向圖中:最小路徑覆蓋=| p|-最大匹配數
3、建圖:如果任務i和任務j可以由一輛計程車共同執行,則將i和j連線。滿足的條件如下:
任務i的完成時間+從任務i的目的地到達任務j的起始地點所花費的時間《任務 j 的開始時間 - 任務 i 的開始時間
#include#include#includeusing namespace std;
#define maxn 505 // 實際問題時需要修改
int mat[maxn][maxn]; // 鄰接矩陣mat 的0行0列不用
int nx, ny; // 實際問題時矩陣的行列數
int fy[maxn], matx[maxn], maty[maxn];
struct point
p[maxn];
int dfs( int u )
} return 0;
} int maximummatch( )
return ret;
}int main()
{ int n,m,i,j,hour,minute,t1,t2;
char s[10];
scanf("%d",&n);
while(n--)
{scanf("%d",&m);
nx=ny=m;
memset(mat,0,sizeof(mat));
for(i=1;i<=m;i++)
{scanf("%s%d%d%d%d",&s,&p[i].a,&p[i].b,&p[i].c,&p[i].d);
sscanf(s,"%d:%d",&hour,&minute);
p[i].time=hour*60+minute;
//cout<
poj2060最小路徑覆蓋
俄羅斯套娃,如果i能裝到j裡面,則從i到j建一條有向邊,問最後能看到幾個娃娃,即需要多少條路徑能夠覆蓋到所有節點。include using namespace std const int oo 1e9 const int mm 111111 const int mn 999 int node,sr...
POJ2060最小路徑覆蓋
題意 有n個任務,如果時間來得及幹完某些任務後還可以接著幹別的任務,給乙個任務清單,問最少派出去多少人能完成所有任務。思路 比較簡單的追小路徑覆蓋問題了,在dag中找到最少的簡單路徑去覆蓋所有點,結論等於n 最大匹配數,可以這樣理解,最開始沒有邊任務都需要乙個人,共n個,然後只要有一條邊 幹完a活來...
最小路徑覆蓋問題(最小路徑覆蓋)
本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...