【codevs】2645 Spore SPFA+判負環

鏈接

題目描述 Description
某陳和某Y 最近對一個遊戲着迷.那是Electronic Arts 今年發佈的優秀的模擬經營類遊戲,Spore. 在Spore 中,玩家將經歷從單細胞生物到星系的統治者的進化過程,創造並守護你自己的文明. 而某陳在經歷了幾天*幾十分鐘/天的遊戲後,也終於已經近乎通關了. 目前,某陳統治着銀河系中標號1 到N 的星系,而他的帝國中心,在星系1 的某顆美麗的行星之上.如同所有銀河系中的文 明一樣,貿易,發展,結盟,擴張,抵抗Grox[銀河系中心的龐大的強悍的恐怖的邪惡帝國]的侵略. 某陳有足夠的力量,他的疆域蔓延幾百個光年.可是Grox 異常強大,他們的飛船出現在某陳瞭解的任何地方,並時常攻擊任 何位置的某陳和盟友的單位[飛船,建築,星球,甚至星系].戰爭在所難免. 某陳將從帝國中心去標號爲N 的星系,他疆域的邊緣,去尋找一個可能存在的通向銀河系中心的黑洞.他要計劃一條合適的 路線. 從星系g1 到達g2,某陳需要花費c1 的代價[主要是燃料,另外還有與沿途Grox 的勢力作戰的花費],c1 小於0 則是因爲 這樣的星系旅行,會給某陳帶來收益[來源於物流差價,以及一些殖民地的稅收..].相應地,c2 則是代表從星系g2 到達g1 的代價.據某陳瞭解,共有M 條這樣的星系間路徑. 爲了戰備,他需要選擇一條總代價最小的路線.
輸入描述 Input Description
輸入文件包括多組數據. 對於每一組數據,第一行有2 個整數n,m,如題目描述中的含義,1<=n<=1000,0<=m<=10000. 接下來的m 行,每行會有四個整數g1,g2,c1,c2,如題目描述中的含義.0<=g1,g2<=n.輸入數據保證所有整數都在[- 10000..10000]的範圍內. n=0,m=0 標識着輸入數據的結束.每個輸入文件包含不超過10 組數據.
輸出描述 Output Description
對於每組輸入數據,輸出一行,爲從星系1 到星系N 的最小代價的路線的代價. 如果這樣的路線不存在,輸出’No such path’.
樣例輸入 Sample Input
3 2 1 2 2 -1 2 3 0 1 0 0
樣例輸出 Sample Output
2
數據範圍及提示 Data Size & Hint
jiantimu

據說這是個裸題,然後我看了一眼題,這不是手速題麼,趕緊spfa水過去…然後成功GG…最後發現忘了清空隊列,還忘了判負環…簡直不能更zz了…趕緊水過…(閱讀理解題真的好惡心)

代碼如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAX_V=10000+10;
const int MAX_E=100000+10;
int first[MAX_V],nxt[MAX_E<<1],d[MAX_V];
struct edge{
    int from,to,cost;
}es[MAX_E<<1];
int tot;
int tim[MAX_V];
bool vis[MAX_V];
int n,m;
queue<int>q;
void init()
{
    memset(first,-1,sizeof(first));
    memset(d,0x3f,sizeof(d));
    memset(vis,0,sizeof(vis));
    memset(tim,0,sizeof(tim));
    while(q.size()) q.pop();
    tot=0;
}
void build(int ff,int tt,int dd)
{
    es[++tot]=(edge){ff,tt,dd};
    nxt[tot]=first[ff];
    first[ff]=tot;
}
bool spfa(int s)
{
    d[s]=0;
    vis[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=first[u];i!=-1;i=nxt[i])
        {
            int v=es[i].to;
            if(d[v]>d[u]+es[i].cost)
            {
                d[v]=d[u]+es[i].cost;
                if(!vis[v])
                {
                    if(++tim[u]>n)
                        return false;
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    return true;
}
int main()
{
    while(cin>>n>>m&&n&&m)
    {
        init();
        int ff,tt,dd1,dd2;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d%d",&ff,&tt,&dd1,&dd2);
            build(ff,tt,dd1);
            build(tt,ff,dd2);
        }
        if(spfa(1))
        {
            if(d[n]==0x3f3f3f3f)
                puts("No such path");
            else
                printf("%d\n",d[n]);
        }
        else
            puts("No such path");
    }
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章