Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project.
Each input file contains one test case. Each case starts with a line containing two positive integers N (≤100), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N−1), and M, the number of activities. Then M lines follow, each gives the description of an activity. For the i
-th activity, three non-negative numbers are given: S[i]
, E[i]
, and L[i]
, where S[i]
is the index of the starting check point, E[i]
of the ending check point, and L[i]
the lasting time of the activity. The numbers in a line are separated by a space.
For each test case, if the scheduling is possible, print in a line its earliest completion time; or simply output “Impossible”.
9 12
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
5 4 0
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4结尾无空行
18
结尾无空行
4 5
0 1 1
0 2 2
2 1 3
1 3 4
3 2 5
Impossible
#include
#define mem(a, b) memset(a, b, sizeof a)
#define INF 0x3f3f3f3f;
using namespace std;
const int maxm = 10010;
struct edge
{
int u, v, w;
} es[maxm];
int n, m;
int dis[maxm], out[maxm];
void init()
{
mem(dis, 0), mem(out, 0);
}
//使用 solve(求最长路径),注意:存在多个出口。
//跟bellman-ford相反
//n轮如果还增加就有环
int solve()
{
int f;
for (int i = 1; i <= n; i++)
{
f = 0;
for (int j = 0; j < m; j++)
if (dis[es[j].u] + es[j].w > dis[es[j].v])
f = 1, dis[es[j].v] = dis[es[j].u] + es[j].w;
if (!f)
return 1;
}
return 0;
}
int main()
{
init();
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &es[i].u, &es[i].v, &es[i].w);
out[es[i].u]++;
}
vector vd; // 最后一个测试点:存在多个出路
for (int i = 0; i < n; i++)
if (!out[i])
vd.push_back(i);
if (solve())
{
int rs = -1;
for (int i = 0; i < vd.size(); i++)
rs = max(rs, dis[vd[i]]);
printf("%d\n", rs);
}
else
puts("Impossible");
return 0;
}
#include
using namespace std;
const int maxn = 105;
const int inf = 999999;
int G[maxn][maxn], dis[maxn];
vector in(maxn); //入度
int n, m;
void solve()
{
int cnt = 0, leastTime = 0;
queue q;
for (int i = 0; i < n; i++)
{
if (!in[i])
q.push(i); //将入度为0的入队
}
while (!q.empty())
{
int u = q.front();
q.pop();
cnt++;
for (int v = 0; v < n; v++)
{
if (G[u][v] != inf)
{
if (--in[v] == 0)
q.push(v); //入度为0就入队
if (dis[u] + G[u][v] > dis[v])
dis[v] = dis[u] + G[u][v]; //永远取最长的
if (dis[v] > leastTime)
leastTime = dis[v]; //记录最长耗时
}
}
}
if (cnt == n)
cout << leastTime << endl;
else
cout << "Impossible\n";
}
int main()
{
fill(G[0], G[0] + maxn * maxn, inf);
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
G[a][b] = c;
in[b]++;
}
solve();
return 0;
}