思路:求從s->t的次短路,不同的是,每條路是可以重複走的;那麼在更新的時候就要注意下了;
可以設dis[i][0] 是s->i 的當前最短路,dis[i][1]是s->i的當前次短路;然後用優先佇列維護這個性質;
typedef pairii;
queueque;//小的優先
node u = que.top();
que.pop();
u.first + w可以更新s->i的當前最短路權的話,也能改變s->i的當前次短路權,同時更新,然後加入佇列;
u.first + w只能更新當前次短的話,就只更新次短,然後介入佇列;
題目鏈結
/*****************************************
author :crazy_ac(jamesqi)
time :
file name :
*****************************************/
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define fill(a,b) memset(a,b,sizeof a)
#define clr(a) memset(a,0,sizeof a)
#define mk make_pair
templateinline t get_max(const t&a,const t&b)
templateinline t get_min(const t&a,const t&b)
const int inf = 0x3f3f3f3f;
const int maxn = 5555;
const int maxm = 555555;
struct edge
}e[maxm];
typedef pairii;
int head[maxn],n,m,e_cnt;
int dis[maxn],length[maxn];//最短,次短
inline void add_edge(int u,int v,int w)
int dijkstra()
else if (dis[v] != tmp.first + w && tmp.first + w < length[v])
// printf("length[%d] = %d\n",v,length[v]);
} }return length[n];
}int main()
printf("case %d: %d\n",++icase,dijkstra());
} return 0;
}
sdnu1099 字首判斷
1099.字首判斷 time limit 1000 ms memory limit 32768 kb total submission s 421 accepted submission s 58 description 給定 n 個字串,求有多少字串是其他字串的字首。input 第一行為乙個整數n...
ZJUT1099 最少攔截系統
沒想到越來越順手 之前一直看別人做這道題,自己卻沒什麼idea。沒想到今天寫了一下,只測試了幾組資料,連修改都沒有就一次ac,而且time 9ms,memory 208k。值得慶幸一下 不過還是要繼續努力。昨天訂的演算法導論沒想到今天就到手了,很是快。贊一下 之後還要好好加油啊!這道題的ac率不高,...
hdu 1099 不可摸數
題目描述 description s n 是正整數n的真因子之和,即小於n且整除n的因子和.例如s 12 1 2 3 4 6 16.如果任何 數m,s m 都不等於n,則稱n為不可摸數.input 包含多組資料,首先輸入t,表示有t組資料.每組資料1行給出n 2 n 1000 是整數。output ...