hdu 4704 Sum(费马小定理)解题报告(完整)
---恢复内容开始---
思路:给你m个交换条件就是相当于m条路,然后求一发最短路就可以了
第一次写spfa 嗯 这道题是spfa + 邻接表
而且这道题还不是那种一般的spfa,要进行n次,一般的spfa只要把源点入队,标记源点,距离置零,其他置inf就行了,
但是这道题不行, 你要把每个点入队,求出来的是自己到自己的最短路 !
#include<cstdio> #include<iostream> #include<vector> #include<cstring> #include<queue> using namespace std; const int maxn = 1e4+5; struct Node{ int x,y; Node(){} Node(int X,int Y):x(X),y(Y){} }; int inq[maxn]; int d[maxn]; vector<Node> e[maxn]; int main(){ // freopen("dwarf.in","r",stdin); // freopen("dwarf.out","w",stdout); int n,m; scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++){//因为之后的v,w都是以1开始的,所以这里要一致 scanf("%d",&d[i]); } int u,v,a; for(int i = 0;i < m;i++){ scanf("%d%d%d",&a,&u,&v); e[u].push_back(Node(v,a)); e[v].push_back(Node(u,a)); } queue<int> q; for(int i = 1;i <= n;i++){ q.push(i); inq[i] = 1; } while(!q.empty()){ int now = q.front(); q.pop(); inq[now] = 0; for(int i = 0;i <e[now].size();i++){ Node temp = e[now][i]; if(d[temp.y] > d[now] + d[temp.x]){ d[temp.y] = d[now] + d[temp.x]; if(!inq[temp.y]){ inq[temp.y] = 1; q.push(temp.y); } } } } // for(int i = 1;i <= n;i++){ printf("%d \n",d[i]); // } return 0; }
Problem D. Dwarf Tower
Input file: dwarf.in
Output file: dwarf.out
Time limit: 2 seconds
Memory limit: 256 megabytes
Little Vasya is playing a new game named “Dwarf Tower”. In this game there are n different items,
which you can put on your dwarf character. Items are numbered from 1 to n. Vasya wants to get the
item with number 1.
There are two ways to obtain an item:
• You can buy an item. The i-th item costs ci money.
• You can craft an item. This game supports only m types of crafting. To craft an item, you give
two particular different items and get another one as a result.
Help Vasya to spend the least amount of money to get the item number 1.
Input
The first line of input contains two integers n and m (1 ≤ n ≤ 10 000; 0 ≤ m ≤ 100 000) — the number
of different items and the number of crafting types.
The second line contains n integers ci — values of the items (0 ≤ ci ≤ 109
).
The following m lines describe crafting types, each line contains three distinct integers ai
, xi
, yi — ai
is
the item that can be crafted from items xi and yi (1 ≤ ai
, xi
, yi ≤ n; ai ̸= xi
; xi ̸= yi
; yi ̸= ai).
Output
The output should contain a single integer — the least amount of money to spend.
Examples
dwarf.in dwarf.out
5 3
5 0 1 2 5
5 2 3
4 2 3
1 4 5
2
3 1
2 2 1
1 2 3
2