題意:輸入n門課,m條路,然後n個整數,表示這n門課要修到的最高等級,m行路每行5個數 a d1 b d2 x;表示的意思是從要花x元錢直接公升級到 b門課的d2等級的前提 是你的a課 要到打d1等級。 要你求 將所有課程等級過完的最小花費。
思路:將每門課的每個等級看成乙個點,每個點都在圖中,每個點只有乙個父親,因為他只能有其他一門課 的前提,所以這是顆,也就是求最小生成樹,但是這是有向的邊。
所以是最小樹形圖。
做法 就是 先將課程的高的等級向低的等級連一條有向邊花費為0,因為一門課等級高的過了,那麼低等級也是過了。
然後根據他輸入的邊建立相應的有向邊,最後將每個課程的0等級的那個點 超點匯聚乙個點,那個點就是最小樹形圖的跟了;
**:#include#include#include#includeusing namespace std;
#define max 55555
#define inf 999999999
struct edge
;vectoredges;
int n,m;
int sum[max];
int kemu[max];
int pre[max];
int in[max];
int vis[max];
int id[max];
void addedge(int x,int y,int w)
; edges.push_back(v);
}int directed_mst(int root, int v)
}/* for(int i=1;i<=v;i++)
printf("\n");
for(int i=1;i<=v;i++)
printf("%d ",in[i]);
printf("\n");*/
for(int i = 1; i <=v; i++)
//2.找環
int cnt = 1;
memset(id, -1, sizeof(id));
memset(vis, -1, sizeof(vis));
in[root] = 0;
for(int i = 1; i <=v; i++) //標記每個環
if(v != root && id[v] == -1)//縮點
}if(cnt == 1) break; //無環 則break
for(int i = 1; i <= v; i++)
if(id[i] == -1) id[i] = cnt++;
//3.建立新圖
for(int i = 0; i < edges.size(); i++)
v = cnt-1;
root = id[root];
// printf("%d %drd\n",root,cnt);
}return ret;
}void init()
/* for(int i=1;i<=n;i++)
*/for(int i=1;i<=n;i++)}}
for(int i=1;i<=m;i++)
for(int i=1;i<=n;i++)
}int main()
{ while(scanf("%d%d",&n,&m)&&n&&m)
{init();
/* for(int i=0;i
lintcod 496 玩具工廠
工廠模式是一種常見的設計模式。請實現乙個玩具工廠 toyfactory 用來產生不同的玩具類。可以假設只有貓和狗兩種玩具。樣例 例1 輸入 toyfactory tf toyfactory toy toy tf.gettoy dog toy.talk 輸出 wow 例2 輸入 toyfactory ...
nyoj 496 巡迴賽 拓撲排序
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 世界拳擊協會 wba 是歷史最悠久的世界性拳擊組織,孕育了眾多的世界冠軍,尤其是重量級,幾乎造就了大家耳熟能詳的所有偉大的拳王。阿里 弗雷澤 福爾曼被稱為 70年代重量級拳壇 三巨頭 是當之無愧的拳王,他們的得到的金腰帶都刻有 ...
nyoj 496 巡迴賽(拓撲排序)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 世界拳擊協會 wba 是歷史最悠久的世界性拳擊組織,孕育了眾多的世界冠軍,尤其是重量級,幾乎造就了大家耳熟能詳的所有偉大的拳王。阿里 弗雷澤 福爾曼被稱為 70年代重量級拳壇 三巨頭 是當之無愧的拳王,他們的得到的金腰帶都刻有 ...