Fork me on GitHub

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
                                                                                                                                                                                                                                                                                                                                                        

posted @ 2018-04-09 19:50  梦想飞的菜鸟  阅读(281)  评论(0)    收藏  举报