diff --git a/QUSTOJ/1769.cpp b/QUSTOJ/1769.cpp new file mode 100644 index 0000000..1d53776 --- /dev/null +++ b/QUSTOJ/1769.cpp @@ -0,0 +1,86 @@ +#include +using namespace std; +const int maxnum = 10005; +const int maxEdge= 50005; +const int maxint = 107391822; + +// 边, +typedef struct Edge{ + int u, v; // 起点,重点 + int weight; // 边的权值 +}Edge; + +Edge edge[maxEdge]; // 保存边的值 +int dist[maxnum]; // 结点到源点最小距离 + +int nodenum, edgenum, source; // 结点数,边数,源点 + +// 初始化图 +void init() +{ + // 输入结点数,边数,源点 + cin >> nodenum >> edgenum ; + source=1; + for(int i=1; i<=nodenum; ++i) + dist[i] = maxint; + dist[source] = 0; + for(int i=1; i<=edgenum; i++) + { + cin >> edge[i].u >> edge[i].v >> edge[i].weight; + if(edge[i].u == source) //注意这里设置初始情况 + dist[edge[i].v] = edge[i].weight; + + /* + /// Another + edge[i+1].u=edge[i].v; + edge[i+1].v=edge[i].u; + edge[i+1].weight=-edge[i].weight; + + if(edge[i+1].u == source) //注意这里设置初始情况 + dist[edge[i+1].v] = edge[i+1].weight; + */ + } +} + +// 松弛计算 +void relax(int u, int v, int weight) +{ + if(dist[v] > dist[u] + weight) + dist[v] = dist[u] + weight; +} + +bool Bellman_Ford() +{ + for(int i=1; i<=nodenum-1; ++i) + for(int j=1; j<=edgenum; ++j) + relax(edge[j].u, edge[j].v, edge[j].weight); + bool flag = 1; + // 判断是否有负环路 + for(int i=1; i<=edgenum; ++i) + if(dist[edge[i].v] > dist[edge[i].u] + edge[i].weight) + { + flag = 0; + break; + } + return flag; +} +int main() +{ + //freopen("input3.txt", "r", stdin); + init(); + if(Bellman_Ford()) + //for(int i = 1 ;i <= nodenum; i++) + cout << dist[nodenum] << endl; + else + throw "WTF??"; + return 0; +} +/* +4 6 +1 2 -5 +2 3 -6 +1 3 -9 +2 4 -7 +3 4 -8 +1 4 6 +*/