我感覺這個題的敘述有問題。
john他媽給他說了一條路線,但是他想走更短的。但是他走出去的第一條路必須是她媽說的,剩下的就隨便走了。
他如果找不到可以到達的路的話,就輸出N。
數據也很弱,我的程序漏洞百出也能過。
#include<stdio.h> #include<math.h> const int INF = 99999990; int t,n,r,w,m; int from,to,now; int mat[1001][1001]; int mo[30001]; int dist[1001],flag[1001]; int i,j,k,start = 1; int sumself,summo,min; int main(void) { scanf("%d",&t); for(k = 1; k <= t; k++ ) { scanf("%d%d",&n,&r); for(i = 1; i <= n; i++ ) //初始化 { dist[i] = INF; flag[i] = 0;//把0寫成1了,wa死了 for( j = 1; j <= n;j++ ) mat[i][j]=INF; } for(i = 1; i <= r; i++ ) //輸入矩陣 { scanf("%d%d%d",&from,&to,&w); mat[from][to] = mat[to][from] = w; } scanf("%d",&m); //他媽給的路線長度 for( i = 1; i <= m; i++ ) scanf("%d",&mo[i]); for( i = 1,summo = 0; i < m; i++ ) summo += mat[ mo[i] ][ mo[i+1] ]; dist[mo[2]] = mat[1][mo[2]]; //從第二個到n點的最短路徑 flag[now = mo[2]] = 1; flag[1] = 1; for ( i = 2; i < n; ++ i ) { for( j = 2; j <= n; ++ j ) if ( !flag[j] && dist[j] > dist[now] + mat[now][j] ) dist[j] = dist[now] + mat[now][j]; for( j = 2,min = INF; j <= n; j++ ) if ( !flag[ j ] && min > dist[j] ) min = dist[ now=j ]; flag[now] = 1; } sumself = dist[n]; printf("TEST %d ",start++); if( sumself == INF ) printf("N/n"); else printf("Y %d/n",summo-sumself); } return 0; }
題目: Input An edge-weighted graph G (V, E). |V| |E| s0 t0 d0 s1 t1 d1 : s|E|-1 t|E|-1 d|E|-1 |V| is the number of ve
最近在做最短路徑的題目,有幾道題是同一個類型的,題意基本都是尋找從A到B所有路徑中,路徑的最大邊的最小值。這樣類型的題有POJ - 2253 Frogger, UVA - 10048 Audiophobia,POJ - 1797
暢通工程續 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41691
前言 BFS模板題 正文 【問題描述】 下圖給出了一個迷宮的平面圖,其中標記爲 1 的爲障礙,標記爲 0 的爲可以通行的地方。 010000 000100 001001 110000 迷宮的入口爲左上角,出口爲右下角,在迷宮
A - Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much sleep as possib
題目鏈接 題意:在一個蜂巢裏,一隻小蜜蜂要從 S 點飛到 T 點。 題解:題目已經保證蜂巢的結構一定是樣例給定的框架,那麼我們可以給按照規律從左到右,從上到下給每個六邊形編號。再用bfs連邊,最後跑一遍最短路即可,思路簡單,只是連邊過程有
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1395
附上詳解博客 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 代碼是學長敲的,我在不懂的地方加了許多註釋,我感覺這一週的東西學的特別喫力,都是一知半解
#include <iostream> #include <cstring> #include <queue> #include <algorithm> #include <cstdio> using namespace std;
回溯法(一) 應用分支限界法的關鍵問題 如何確定合適的限界函數 常見方法是先對整個問題估計出下界(最小化問題)或上界(最大化問題),而限界函數是在部分解的基礎上對剩餘的未知部分進行界的重新估計 如何組織待處理結點表 如何確
Floyd算法是大二到大三期間集訓時候纔算真正接觸的,或許只有前一段時間DP的積累現在纔算是真正理解 這個算法需要充分理解DP的滾動數組思想才能算是真正的掌握 Floyd算法又稱爲插點法 算法的目標是要求圖中所有兩個點的最短距離,就用di
dijistra算法:跑過一邊之後就把源點到所有點的最短距離都求出來了。 算法思想其實應該屬於DP,因爲這個問題有着明顯的最優子結構 d[y]是指源點到y的最短距離,那顯而易見:d[y] = min{d[x]+w(x,y)} 這個和一般的
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s):
圖的應用 1.最小生成樹(研究問題:N個村莊修路連通,怎樣花銷最小讓N個村莊連通) 一個連通圖的生成樹是該圖的極小連通子圖,通常爲帶權無向圖 包含所有頂點,儘量少的邊。 刪除一條邊則變爲非連通圖,增加一條邊則會產生迴路。 特點:
dijkstra的題目一般給出每條邊的起點、終點、權值,需要轉化成鄰接矩陣或鄰接表 鄰接矩陣的時間複雜度爲O(v^2), 鄰接表的時間複雜度爲O(v^2+E) dijkstra算法用於求單源最短路徑,即某個頂點到其他所有頂點的最短