hdu 1385
(1)題意:
n個城市,每個城市之間有可能有一條路,走過這條路的花費為x,經過每個城市的花費為val,
給出n*n的城市地圖,q個查詢,每次查詢x y城市之間的最短距離。
如果有多條最短路,輸出字典序最小的那條。
(2)spfa思路:
path陣列記錄路徑,如果存在多條最短路,就用字串記錄一下最短路,比較一下誰的字典序更大。
用dfs遞迴查詢最短路。
(3)**:
#include#include#include#include#include#include#includeusing namespace std;
const int maxn = 2005;
const int inf = 1e9+10;
int vis[maxn],dis[maxn],mp[maxn][maxn],n,val[maxn],pos,path[maxn];
char s1[maxn],s2[maxn];
void dfs(int x,char *ss)
bool cmp(int p1,int p2)
void print(int x)
void spfa(int st,int ed)
dis[st] = 0;
queue q;
q.push(st);
while(!q.empty())
}else if(dis[i]==dis[x]+mp[x][i]+val[i]&&cmp(i,x))
}} }
printf("from %d to %d :\n",st,ed);
printf("path: ");
print(ed);
printf("\n");
printf("total cost : %d\n\n",dis[ed]);
}int main(void)
} for(int i=1;i<=n;i++) scanf("%d",&val[i]);
int x,y;
while(~scanf("%d%d",&x,&y))
int tp1 = val[x],tp2 = val[y];
val[x] = val[y] = 0;
spfa(x,y);
val[x] = tp1;val[y] = tp2;
} }return 0;
}
(4)ford思路:
用path[i][j]陣列記錄路徑i到j路徑上的經過的第乙個節點,然後不斷更新這個節點,得到最終的路徑。
(感覺這題就是為ford出的)。
(5)**:
#include#include#include#includeusing namespace std;
const int maxn = 2005;
const int inf = 1e9+10;
int mp[maxn][maxn],path[maxn][maxn],n,val[maxn];
void ford()
else if(mp[i][j]==tp&&path[i][j]>path[i][k])
}} }
}int main(void)
for(int i=1;i<=n;i++) scanf("%d",&val[i]);
ford();
int x,y;
while(~scanf("%d%d",&x,&y))
printf("%d\n",y);
printf("total cost : %d\n\n",mp[x][y]);
//val[x] = t1;val[y] = t2;
} }return 0;
}
參考文章 字典序最小的最短路
給出n和m,有n個點,m條雙向邊,1為起點,n為終點,每條邊都有乙個權值,經過每一條邊的時間都為1,求從起點到終點既要時間最少,又要權值組成的序列的字典序最小的一條路徑.4 6 1 2 1 1 3 2 3 4 3 2 3 1 2 4 4 3 1 1 2 1 3 50 n 100 100 n 1000...
最短路 逆向思維 字典序最小
題意 無向圖,每個點由大小寫組成,大寫字母代表城鎮,經過需要繳納 ce il s um 20 ceil sum 20 ceil sum 20費用,小寫字母代表村莊,經過需要繳納1 11費用。已經到達目的地點t tt,需要運送到的貨物,求從起點s ss需要帶的貨物的最小值,並輸出字典序最小的路線 起點...
HDU 2544 最短路 最短路
最近複習了最短路徑的演算法,就寫了4個版本的測試。正好是模板題,就果斷a之。dijkstar版本 include include include include include include includeusing namespace std define n 110 define max 99...