因為有負權邊,所以不能 dijkstra ,本題資料還卡 spfa
但是我們發現,有負權的都是有向邊,而且如果把無向邊連成的聯通塊看成乙個點的話,有向邊就連成了乙個 dag,所以我們可以對所有的聯通塊用dij求最短路
在 dag上用拓撲序求最短路
注意:堆優化的 dijkstra 在定義的結構體重載運算子的時候注意相反
因為存在負權邊,所以兩點不可達,不等價於兩點間的距離 == inf ,應為 兩點間的距離大於乙個很大的數
#include #include #include #include #include #include #include #include using namespace std;
const int maxn = 100005;
int init()
while(c >= '0' && c <= '9')
return fh * rv;
}int head[maxn], n, m1, m2, s, nume, id[maxn], tot, dis[maxn], cnt[maxn];
bool f[maxn];
vector ve[25005];
struct edgee[maxn<<1];
void adde(int from, int to, int dis)
void dfs(int u)
}struct node
};priority_queue q;
queue qq;
void dij(int x));
while(!q.empty())
if(id[v.num] != id[u.num])
}} }
}int main()
for(int i = 1; i <= n; i++)
for(int i = 1; i <= m2; i++)
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
for(int i = 1; i <= tot; i++) if(!cnt[i]) qq.push(i);
while(!qq.empty())
for(int i = 1; i <= n; i++)
return 0;
}
洛谷P2296 尋找道路
在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。輸入格式...
洛谷 P2296 尋找道路
題目描述 在有向圖g 中,每條邊的長度均為1 現給定起點和終點,請你在圖中找一條從起點到終點的路徑,該路徑滿足以下條件 1 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。2 在滿足條件1 的情況下使路徑最短。注意 圖g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度...
洛谷 P2296 尋找道路
題目大意 在乙個有向圖中找出2點之間的最短路,並且路徑上的所有點的出邊所指向的點都直接或間接與終點連通。題解 spfa 佇列 dfs 1.從終點方向搜,把終點能到的點標記可到達。2.把終點能到達的點的出邊判斷,如果出邊未被標記則狀態更新為不可到達。3.做spfa,若t i 可以到達就做,不然不做。v...